6

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

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

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

  1. 延迟生成器?
  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

目前,我调用它:

d = threads.deferToThread(django_useravailable, from_attr, user_available)
d.addCallback(self.success)
d.addErrback(self.failure)
4

3 回答 3

1

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

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

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

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

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

如果您希望此进程运行在任意数量的服务器中,那么请从init.rc或启动它cron

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

于 2009-10-29T13:30:23.953 回答
1

我已经成功地使用了您描述为当前方法的方法。通过阅读文档,您会发现 twisted DB api 在后台使用线程,因为大多数 SQL 库都有一个阻塞 API。

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

你是说你正在启动一个子线程并且仍然阻塞?

于 2009-11-04T23:42:42.893 回答
0

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

于 2009-11-05T21:20:12.983 回答