我有一个正常的Django站点在运行。此外,还有另一个扭曲的进程,它侦听Jabber存在通知并使用Django的ORM更新Django DB。
到目前为止,它可以工作,因为我只调用了相应的Django模型(在正确设置了设置环境之后)。然而,这阻止了Twisted应用程序,这不是我想要的。
由于我刚接触到扭曲,我不知道最好的方式是使用延迟以非阻塞的方式访问Django DB (通过它的ORM)。
如果解析了存在消息,我想在Django DB中保存使用jid_str的用户是联机/脱机的(使用Django模型UserProfile)。我就是这样做的:
def django_useravailable(jid_str,user_available):try: userhost = jid.JID(jid_str).userhost() user = user_available user.im_jabber_online = user_available user.save()返回jid_str,user_available除了异常,e:打印e raise jid_str,user_available,e
目前,我引用它的理由如下:
d = threads.deferToThread(django_useravailable, from_attr, user_available)
d.addCallback(self.success)
d.addErrback(self.failure)发布于 2009-10-29 13:30:23
“我有一个正常的Django站点在运行。”
大概是在Apache下使用mod_wsgi或类似的。
如果您使用的是嵌入在Apache中的mod_wsgi,请注意Apache是多线程的,并且您的Python线程被混合到Apache的线程中。对阻塞的分析可能会让人不舒服。
如果您在守护进程模式下使用mod_wsgi (应该是这样),那么Django是一个单独的进程。
为什么不继续这种设计模式,并使您的"jabber侦听器“成为一个单独的过程。
如果您希望运行多个服务器中的任何一个进程,那么让它从init.rc或cron启动。
因为这是一个独立的过程,它不会争夺注意力。Django进程运行迅速,Jabber侦听器独立运行。
发布于 2009-11-04 23:42:42
我已经成功地使用了您描述为当前方法的方法。通过读取文档,您会发现扭曲的DB使用隐藏下的线程,因为大多数SQL库都有一个阻塞API。
我有一个扭曲的服务器,它可以从现场的电源监视器中保存数据,它可以通过时不时地启动一个子线程并调用我的Django保存代码来做到这一点。您可以阅读更多关于我的实时数据收集管道的信息(这是一个博客链接)。
您是说您正在启动一个子线程,而该子线程仍处于阻塞状态?
发布于 2009-11-05 21:20:12
我有一个运行的Twisted应用程序,我使用Django ORM。我不会推迟的。我知道这是错误的,但还没有问题。
https://stackoverflow.com/questions/1642392
复制相似问题