如何使Python对象在web应用程序中持久化?

如何使Python对象在web应用程序中持久化?,python,web-applications,concurrency,persistence,Python,Web Applications,Concurrency,Persistence,我正在编写一个相当复杂的web应用程序。Python后端运行一个算法,该算法的状态取决于存储在几个相互关联的数据库表中的数据,这些数据库表不经常更改,加上用户特定的数据经常更改。当用户使用应用程序时,算法的每用户状态会经历许多小的变化。该算法经常在每个用户的工作中用于做出某些重要决策 出于性能原因,对来自(半规范化)数据库数据的每个请求重新初始化状态很快变得不可行。例如,最好以某种方式缓存状态的Python对象,以便在必要时可以简单地使用和/或更新它。然而,由于这是一个web应用程序,有几个进程

我正在编写一个相当复杂的web应用程序。Python后端运行一个算法,该算法的状态取决于存储在几个相互关联的数据库表中的数据,这些数据库表不经常更改,加上用户特定的数据经常更改。当用户使用应用程序时,算法的每用户状态会经历许多小的变化。该算法经常在每个用户的工作中用于做出某些重要决策

出于性能原因,对来自(半规范化)数据库数据的每个请求重新初始化状态很快变得不可行。例如,最好以某种方式缓存状态的Python对象,以便在必要时可以简单地使用和/或更新它。然而,由于这是一个web应用程序,有几个进程为请求提供服务,因此使用全局变量是不可能的

我已经尝试序列化相关对象(通过pickle)并将序列化数据保存到数据库中,现在正在尝试通过memcached缓存序列化数据。但是,这仍然需要经常序列化和反序列化对象

我看过共享内存解决方案,但我发现唯一相关的是。然而,POSH似乎并没有被广泛使用,我觉得将这样一个实验性组件集成到我的应用程序中并不容易

我需要一些建议!这是我第一次尝试开发一个web应用程序,所以我希望这是一个足够普遍的问题,有众所周知的解决方案来解决这些问题。在这一点上,假设Python后端在一台服务器上运行的解决方案就足够了,但对于扩展到多台服务器的解决方案,还有额外的要点:)

注:

  • 我有这个应用程序的工作,目前生活和活跃的用户。我一开始没有做任何过早的优化,然后根据需要进行优化。我已经做了测量和测试,以确保上述问题是实际的瓶颈。我确信我可以从当前的设置中挤出更多的性能,但是我想问问是否有更好的方法
  • 设置本身仍在进行中;假设系统的架构可以是适合您的解决方案的任何架构

    • 我想你可以给ZODB一次机会

      “ZODB的一个主要特性是透明性。您不需要编写任何代码来显式地向数据库或从数据库中读取或写入对象。您只需将持久对象放入一个类似Python字典的容器中。该字典中的所有内容都保存在数据库中。该字典被称为“根”“数据库的管理。它就像一个神奇的袋子;放入其中的任何Python对象都将成为持久对象。”

      起初,它是Zope的一个组成部分,但最近还提供了一个独立的包

      它有以下限制:

      “实际上,在ZODB中可以存储的内容有一些限制。您可以将任何可以“pickle”为标准、跨平台串行格式的对象存储起来。可以对列表、字典和数字等对象进行pickle处理。文件、套接字和Python代码对象等对象不能存储在数据库中,因为它们不能被pickle。”

      我已经读过了,但我自己还没试过

      其他可能的事情可能是内存中的sqlite db,这可能会加快进程—作为内存中的db,但仍然需要进行序列化工作。 注意:内存中的db在资源上很昂贵


      这里有一个链接:

      小心过早优化

      另外:“Python后端运行一个算法,其状态…”是web框架中的会话。就是这样。让Django框架在cache.Period中维护会话状态

      “当用户使用应用程序时,算法的每用户状态会经历许多小的变化。”大多数web框架都提供缓存会话对象。通常它的性能非常高。请参阅Django的

      忠告。[修订]

      你似乎有一些有用的东西。利用它来学习你的框架,学习工具,了解你可以不费吹灰之力地转动哪些旋钮。特别是,使用会话状态

      第二,摆弄缓存、会话管理和易于调整的东西,看看你是否有足够的速度。通过尝试找出MySQL套接字或命名管道是否更快。这些都是无编程优化

      第三,测量性能以发现实际的瓶颈。准备好提供(并捍卫)足够细粒度的测量结果,以使其足够有用和稳定,从而提供有意义的备选方案比较


      例如,显示持久会话和缓存会话之间的性能差异。

      另一个选项是查看状态要求,听起来如果序列化是瓶颈,那么对象非常大。您真的需要这么大的对象吗

      我知道,在Stackoverflow播客27中,reddit的人讨论了他们在state中使用的内容,因此可能很有用。

      我认为该框架有可能适用于这里的内容,即共享ctypes模块


      多处理对于Python来说是相当新的,因此它可能有一些奇怪之处。我不太确定该解决方案是否适用于不是通过
      多处理产生的进程。首先,您的方法不是常见的web开发实践。即使使用多线程,web应用程序也被设计为能够运行多线程-处理环境,以实现可扩展性和更轻松的部署

      如果您只需要初始化一个大对象,而不需要在以后进行更改,那么可以通过使用在创建WSGI应用程序或加载包含该对象的模块时初始化的全局变量来轻松完成