Django中请求之间的共享对象

时间:2011-08-03 13:54:51

标签: python django

我正在使用Python模块(PyCLIPS)和Django 1.3。

我想开发一个线程安全类,它实现了Object Pool和Singleton模式,并且还必须在Django中的请求之间共享。

例如,我想执行以下操作:

  • 请求从池中获取带有一些ID的对象 与它有关的东西并将其推回池中,然后发送响应 使用对象的ID。
  • 另一个具有对象ID的请求获取 来自池中具有给定ID的对象,并重复上述请求中的步骤。
  • 但是当服务器运行时,对象的状态必须保留在池中。

它应该像Singleton Session Bean in Java EE

我应该怎么做?有什么我应该读的吗?

更新 我无法在数据库中存储池中的对象,因为这些对象是用C语言编写的库下的包装器,这是Expert System Engine CLIPS的API。

谢谢!

3 个答案:

答案 0 :(得分:7)

嗯,我认为这里需要一个不同的角度。 Django不像Java,解决方案应该针对多进程环境而不是多线程环境进行定制。

Django没有立即相当于单例会话bean。

那就是说,我认为你的描述没有理由不适合经典的数据库模型。您希望保存每个对象数据,该数据应始终位于数据库层中。

否则,您可以随时在会话中保存内容,Django为登录用户和匿名用户提供了这些内容 - see the docs on Django sessions

考虑到运行Java Web容器和Python / Django多进程环境之间的巨大差异,使用Java环境中可能熟悉的任何其他模式最终都会失败。


编辑:好吧,考虑到这些对象不是您的应用程序的原生对象,而是通过第三方库访问,它确实使事情变得复杂。我的直觉是,这些对象不应该由Web层处理,而是由可以从多进程环境访问的某种外部服务处理。正如丹尼尔所提到的,你总是可以把它们放在缓存中(如果所说的对象是可以腌制的)。但感觉好像这些对象不属于Web层。

答案 1 :(得分:2)

假设无法对对象进行pickle,您将需要创建一个应用来管理对象以及需要对其进行的所有交互。最简单的实现可能是创建一个单独的进程wsgi app(在不同的端口上),它公开了一个api来完成你需要的所有操作。无论您使用RESTful api还是表单帖子都取决于您的个人喜好。

答案 2 :(得分:1)

这些数据库对象是?因为如果是这样,db本身就是池,并且不需要做任何特殊的事情 - 每个请求都可以独立地从db加载实例,修改它并将其保存回来。

评论后编辑嗯,最大的问题是生产Web服务器环境可能是多进程的,因此任何全局变量(即池)都不会在进程之间共享。您需要将它们存储在全球可访问的地方。在黑暗中短暂,但是它们是否可以使用Pickle进行序列化?如果是这样,那么也许memcache可能有用。