我有一个正常的Django网站在运行。此外,还有另一个twisted进程,它监听Jabber状态通知并使用Django的ORM更新Django数据库。在
到目前为止,它的工作方式与我调用相应的Django模型一样(在正确设置了设置环境之后)。然而,这阻止了Twisted应用程序,这不是我想要的。在
由于我是twisted的新手,我不知道,最好的方法是使用deferreds以非阻塞的方式(通过其ORM)访问Django DB。在
如果解析了状态消息,我想在Django数据库中保存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)
我已经成功地使用了你描述的你目前的方法。通过阅读文档,您会发现twisted DB api在幕后使用线程,因为大多数SQL库都有一个阻塞api。在
我有一个twisted服务器,它保存来自现场电源监视器的数据,它通过时不时地启动一个子线程并调用我的Django save代码来实现。您可以阅读有关my live data collection pipeline(这是一个博客链接)的更多信息。在
你是说你正在启动一个子线程,而这仍然是阻塞?在
“我有一个正常的Django站点在运行。”
大概是在Apache下使用mod wsgi或类似的。在
如果您使用的是嵌入在Apache中的mod_wsgi,请注意Apache是多线程的,您的Python线程被混入Apache的线程中。对什么是阻塞的分析可能会让人讨厌。在
如果您在守护程序模式下使用mod wsgi(应该是这样),那么您的Django是一个单独的进程。在
为什么不继续这种设计模式,让你的“叽叽喳喳的听众”成为一个单独的过程。在
如果您希望此进程在多个服务器中的任何一个服务器上运行,那么请从}启动它。在
init.rc
或{因为这是一个单独的过程,它不会争夺注意力。Django进程运行迅速,Jabber侦听器独立运行。在
我有一个运行Twisted的应用程序,我使用Django ORM。我不会推迟的。我知道这是错的,但还没有问题。在
相关问题 更多 >
编程相关推荐