如何在Twisted中推迟Django DB操作?

时间:2009-10-29 08:57:03

标签: python django twisted deferred-execution

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

到目前为止,它只是调用相应的Django模型(在正确设置了设置环境之后)。但是,这会阻止Twisted应用程序,这不是我想要的。

由于我不熟悉,我不知道,使用延迟以非阻塞方式访问Django DB(通过其ORM)的最佳方法是什么。

  1. deferredGenerator?
  2. twisted.enterprise.adbapi? (规避ORM?)
  3. ???
  4. 如果解析了在线消息,我想在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)
    

3 个答案:

答案 0 :(得分:1)

“我正常运行Django网站。”

大概是在使用mod_wsgi或类似的Apache下。

如果您正在使用嵌入在Apache中的mod_wsgi,请注意Apache是​​多线程的,并且您的Python线程被嵌入到Apache的线程中。分析什么是阻止可能会icky。

如果你在守护进程模式下使用mod_wsgi(你应该这样),那么你的Django是一个单独的进程。

为什么不继续这种设计模式,让你的“jabber listener”成为一个独立的过程。

如果您希望此流程在任何服务器中运行,请从init.rccron启动。

因为这是一个单独的过程,所以不会争夺注意力。您的Django进程快速运行,您的Jabber侦听器独立运行。

答案 1 :(得分:1)

我成功使用您描述的方法作为当前方法。您可以通过阅读文档来了解扭曲的数据库API使用线程,因为大多数SQL库都有阻塞API。

我有一个扭曲的服务器,可以从现场的电源监视器中保存数据,它通过不时启动子线程并调用我的Django保存代码来实现。您可以阅读有关my live data collection pipeline的更多信息(这是博客链接)。

您是说您正在启动子线程并且仍然阻止?

答案 2 :(得分:0)

我有一个正在运行的Twisted应用程序,我使用Django ORM。我不是在推迟。我知道这是错的,但还没有问题。