【发布时间】:2010-09-24 17:28:00
【问题描述】:
我正在编写一个相当复杂的 Web 应用程序。 Python 后端运行一种算法,其状态取决于存储在几个相互关联的数据库表中的数据,这些数据表不经常更改,加上用户特定的数据经常更改。当用户使用应用程序时,算法的每个用户状态会发生许多小的变化。在每个用户的工作中经常使用这种算法来做出某些重要的决定。
出于性能原因,对来自(半规范化)数据库数据的每个请求重新初始化状态很快变得不可行。例如,最好以某种方式缓存状态的 Python 对象,以便在必要时可以简单地使用和/或更新它。但是,由于这是一个 Web 应用程序,有多个进程为请求提供服务,因此使用全局变量是不可能的。
我已经尝试序列化相关对象(通过pickle)并将序列化数据保存到数据库,现在正在尝试通过memcached 缓存序列化数据。但是,这仍然具有经常序列化和反序列化对象的巨大开销。
我查看了共享内存解决方案,但我发现唯一相关的是POSH。但是 POSH 似乎没有被广泛使用,我觉得将这样一个实验性组件集成到我的应用程序中并不容易。
我需要一些建议!这是我开发 Web 应用程序的第一次尝试,所以我希望这是一个足够普遍的问题,以便有针对此类问题的众所周知的解决方案。此时假设 Python 后端在单个服务器上运行的解决方案就足够了,但对于扩展到多个服务器的解决方案也可以加分:)
注意事项:
- 我有这个应用程序正在运行,目前正在运行并且有活跃用户。我一开始没有做任何过早的优化,然后根据需要进行优化。我已经完成了测量和测试,以确保上述问题是实际的瓶颈。我很确定我可以从当前设置中获得更多性能,但我想问问是否有更好的方法。
- 设置本身仍在进行中;假设系统架构可以是任何适合您的解决方案的架构。
【问题讨论】:
-
哪个框架?樱桃派?姜戈?
-
您是否进行过任何测量来证明状态访问是瓶颈? pickle 有多大,unpickle 需要多少时间,整个请求需要多长时间等?
-
@Martin:pickle 大约 2MB 大(协议 2),反序列化和序列化占用了 90% 的请求处理时间。
-
@S.Lott:我特意没有提到我的框架、操作系统等,因为这些都是我愿意改变的,我希望允许使用适合工作的任何工具来解决问题。
标签: python web-applications concurrency persistence