首页 文章

异步守护进程处理/ ORM与Django的交互

提问于
浏览
0

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

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

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

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

干杯

2 回答

  • 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

    顺便问一下,你了解线程和进程之间的区别吗?它有点重要 .

  • 3

    看看celery . 我想这可以解决你的问题 . 它使用多处理模块 . 它需要(非常)小的设置,但是在缩放方面有很大帮助 .

相关问题