Djang中请求之间的共享对象

2024-06-16 10:11:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是Python模块(PyCLIPS)和Django 1.3。

我想开发一个线程安全类,它实现了对象池和单例模式,并且在Django中的请求之间必须共享。

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

  • 请求从池中获取具有某个ID的对象,do 把它推到池子上,然后发送响应 对象的ID
  • 另一个具有对象ID的请求 池中具有给定ID的对象,并重复上述请求中的步骤。
  • 但当服务器运行时,对象的状态必须保持在池中。

它应该像一个Singleton Session Bean in Java EE

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

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

谢谢!


Tags: 模块对象django服务器idsession状态模式
3条回答

好吧,我觉得有必要换个角度。Django不像Java,解决方案应该针对多进程环境而不是多线程环境进行定制。

Django没有立即等效于singleton会话bean。

也就是说,我看不出你的描述为什么不适合一个经典的数据库模型。您希望保存每个对象的数据,这些数据应该始终位于数据库层中。

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

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


编辑:好吧,考虑到这些对象不是应用程序的本机对象,而是通过第三方库访问的,这会使事情复杂化。我的直觉是,这些对象不应该由web层处理,而应该由某种可以从多进程环境访问的外部服务来处理。正如Daniel所提到的,您总是可以将它们放入缓存(如果所述对象是可pickle的)。但感觉这些对象不属于web层。

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

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

评论后编辑好吧,最大的问题是生产web服务器环境可能是多进程的,因此任何全局变量(即池)都不会在进程之间共享。您需要将它们存储在全局可访问的位置。在黑暗中很短,但是他们是不是可以用泡菜连载?如果是的话,那么memcache也许可以工作。

相关问题 更多 >