【问题标题】:Asynchronous daemon processing / ORM interaction with Django异步守护进程处理/与 Django 的 ORM 交互
【发布时间】:2010-05-10 19:47:26
【问题描述】:

我正在寻找一种使用 Django ORM 的守护进程进行异步数据处理的方法。然而,ORM 不是线程安全的。尝试从线程中检索/修改 django 对象不是线程安全的。所以我想知道实现异步的正确方法是什么?

基本上我需要完成的是获取数据库中的用户列表,查询第三方 api,然后为这些用户更新用户配置文件行。作为守护进程或后台进程。为每个用户按顺序执行此操作很容易,但完全可扩展需要很长时间。如果守护进程是通过ORM检索和更新用户,如何实现一次处理10-20个用户?我会为此使用标准的线程/队列系统,但你不能像

那样线程交互

models.User.objects.get(id=foo) ...

Django 本身是一个异步处理系统,它为每个请求进行异步 ORM 调用(?),所以应该有办法做到吗?到目前为止,我还没有在文档中找到任何内容。

干杯

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    看看celery。我想这会解决你的问题。它使用多处理模块。它需要(非常)少的设置,但对扩展有很大帮助。

    【讨论】:

      【解决方案2】:

      如果您的异步处理是在自己的进程中完成的,那么线程安全就不是问题,因为您的线程不共享地址空间,因此它们不会相互干扰。他们每个人都有自己的模型对象副本。并发将由具有事务的数据库控制。所以你很好。

      如果您要在其中一个 Web 服务器进程中生成一个线程来执行异步业务,那么您需要锁定所有非线程安全的 API 调用。

      from threading import Lock
      

      Apache 通过 fork() 系统调用使用多个进程来处理并发 Web 请求。这就是为什么 Django 的 ORM API 不需要是线程安全的。我相信 Apache 可能能够使用线程而不是进程,但它认为必须禁用该功能才能使用 Django。

      http://groups.google.com/group/django-developers/browse_thread/thread/905f79e350525c95

      顺便说一句,你了解线程和进程之间的区别吗?它很重要。

      【讨论】:

        猜你喜欢
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2021-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多