我正常运行Django网站。此外,还有另一个扭曲的进程,它使用Django的ORM监听Jabber状态通知并更新Django数据库。
到目前为止,它只是调用相应的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 = UserProfile.objects.get(im_jabber_name=userhost) user.im_jabber_online = user_available user.save() return jid_str, user_available except Exception, e: print e raise jid_str, user_available,e
目前,我用以下方式调用它:
d = threads.deferToThread(django_useravailable, from_attr, user_available)
d.addCallback(self.success)
d.addErrback(self.failure)
答案 0 :(得分:1)
“我正常运行Django网站。”
大概是在使用mod_wsgi或类似的Apache下。
如果您正在使用嵌入在Apache中的mod_wsgi,请注意Apache是多线程的,并且您的Python线程被嵌入到Apache的线程中。分析什么是阻止可能会icky。
如果你在守护进程模式下使用mod_wsgi(你应该这样),那么你的Django是一个单独的进程。
为什么不继续这种设计模式,让你的“jabber listener”成为一个独立的过程。
如果您希望此流程在任何服务器中运行,请从init.rc
或cron
启动。
因为这是一个单独的过程,所以不会争夺注意力。您的Django进程快速运行,您的Jabber侦听器独立运行。
答案 1 :(得分:1)
我成功使用您描述的方法作为当前方法。您可以通过阅读文档来了解扭曲的数据库API使用线程,因为大多数SQL库都有阻塞API。
我有一个扭曲的服务器,可以从现场的电源监视器中保存数据,它通过不时启动子线程并调用我的Django保存代码来实现。您可以阅读有关my live data collection pipeline的更多信息(这是博客链接)。
您是说您正在启动子线程并且仍然阻止?
答案 2 :(得分:0)
我有一个正在运行的Twisted应用程序,我使用Django ORM。我不是在推迟。我知道这是错的,但还没有问题。