我正在寻找一种使用Django ORM的守护进程进行异步数据处理的方法 . 但是,ORM不是线程安全的;尝试从线程内检索/修改django对象不是线程安全的 . 所以我想知道实现异步的正确方法是什么?
基本上我需要完成的是获取数据库中的用户列表,查询第三方API,然后为这些用户更新用户配置文件行 . 作为守护进程或后台进程 . 每个用户按顺序执行此操作非常简单,但完全可扩展需要很长时间 . 如果守护程序通过ORM检索和更新用户,如何一次处理10-20个用户?我会为此使用标准的线程/队列系统,但你不能像以前那样进行线程交互
models.User.objects.get(id=foo) ...
Django本身是一个异步处理系统,它为每个请求进行异步ORM调用(?),所以应该有办法做到这一点?到目前为止,我还没有在文档中找到任何内容 .
干杯
2 回答
如果您的异步处理是在自己的进程中完成的,那么线程安全不是问题,因为您的线程没有共享地址空间,因此它们不会相互干扰 . 他们每个人都有自己的模型对象副本 . 并发将由具有事务的数据库控制 . 所以你的罚款 .
如果您要在其中一个Web服务器进程中生成一个线程来执行异步业务,那么您需要锁定所有非线程安全的API调用 .
Apache通过fork()系统调用使用多个进程来处理并发Web请求 . 这就是Django的ORM API不需要线程安全的原因 . 我相信Apache可能能够使用线程而不是进程,但它认为必须禁用该功能才能使用Django .
http://groups.google.com/group/django-developers/browse_thread/thread/905f79e350525c95
顺便问一下,你了解线程和进程之间的区别吗?它有点重要 .
看看celery . 我想这可以解决你的问题 . 它使用多处理模块 . 它需要(非常)小的设置,但是在缩放方面有很大帮助 .