如何从Twisted中推迟Django数据库操作?

6 python django twisted deferred-execution

我有一个正常的Django网站运行.此外,还有另一个扭曲的过程,它使用Django的ORM监听Jabber存在通知并更新Django DB.

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

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

  1. deferredGenerator?
  2. twisted.enterprise.adbapi?(规避ORM?)
  3. ???

如果解析在线消息,我想在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
Run Code Online (Sandbox Code Playgroud)

目前,我用以下方式调用它:

d = threads.deferToThread(django_useravailable, from_attr, user_available)
d.addCallback(self.success)
d.addErrback(self.failure)
Run Code Online (Sandbox Code Playgroud)

S.L*_*ott 1

“我有一个正常的 Django 站点正在运行。”

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

如果您使用 Apache 中嵌入的 mod_wsgi,请注意 Apache 是多线程的,并且您的 Python 线程会合并到 Apache 的线程中。对阻塞的分析可能会变得很棘手。

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

为什么不继续这种设计模式并使您的“jabber 侦听器”成为一个单独的进程。

如果您希望此进程在任意多个服务器中运行,则可以从init.rc或启动它cron

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