【问题标题】:How to defer a Django DB operation from within Twisted?如何从 Twisted 中推迟 Django DB 操作?
【发布时间】:2010-12-11 04:10:07
【问题描述】:

我有一个正常的 Django 站点正在运行。此外,还有另一个扭曲的进程,它监听 Jabber 存在通知并使用 Django 的 ORM 更新 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

目前,我调用它:

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

【问题讨论】:

  • 请发布代码,尤其是“阻止”您的应用的部分。

标签: python django twisted deferred-execution


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我希望有机会在需要时将出席通知处理程序迁移到另一台服务器。使用不容易实现的工艺解决方案。此外,我喜欢扭曲的异步方法,我认为它可以处理大量的通知更改。我想会有比网站点击更多的通知。
【解决方案2】:

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

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

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

【讨论】:

  • 但是使用twisted 的原因是我们确实想要使用线程。如果我必须坚持使用当前的线程版本,那么使用 twisted 没有任何好处。那我还不如直接使用Django进程中的线程。
  • 是的,因为这个原因我也讨厌它。至少您可以确保启动的数据库线程数量有限(即管理 1000 个客户端连接并巧妙地将它们的数据库访问和线程池化)。数据库使用只是我由 twisted 管理的长期连接的一小部分,因此可以按需启动线程。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 2012-04-03
    • 2016-04-04
    • 2020-12-17
    相关资源
    最近更新 更多