如何从Twisted内部延迟Django-DB操作?

2024-06-01 07:36:09 发布

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

我有一个正常的Django网站在运行。此外,还有另一个twisted进程,它监听Jabber状态通知并使用Django的ORM更新Django数据库。在

到目前为止,它的工作方式与我调用相应的Django模型一样(在正确设置了设置环境之后)。然而,这阻止了Twisted应用程序,这不是我想要的。在

由于我是twisted的新手,我不知道,最好的方法是使用deferreds以非阻塞的方式(通过其ORM)访问Django DB。在

  1. 延迟发生器?在
  2. 在扭曲的.enterprise.adbapi? (避开ORM?)在
  3. ???在

如果解析了状态消息,我想在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)

Tags: django模型数据库状态方式ormtwistedjid
3条回答

我已经成功地使用了你描述的你目前的方法。通过阅读文档,您会发现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。我不会推迟的。我知道这是错的,但还没有问题。在

相关问题 更多 >