Django + Celery + 请求 + Eventlet

Django + Celery + Requests + Eventlet

我有一个 Django + Celery 项目。 Celery 任务之一使用请求库执行大量小型 HTTP 请求,而其他任务则通过 Django ORM 与数据库进行大量对话。 HTTP 繁重的任务已经 运行 在它自己的 celery worker 中使用它自己的 Celery 队列。我想让 HTTP 繁重的工作人员使用 eventlet,同时让其余任务使用 prefork 执行池。我该怎么做?

Celery docs seem to suggest that I gain magical concurrency powers by just running celery ... -P eventlet. However, 说我需要使用请求库的补丁版本。哪个是正确的?此外,如果我必须明确地修补请求,我是否必须将此任务与其他常规任务放在一个单独的模块中,以便这些其他任务可以继续使用常规版本的请求?

TL,DR: 使用请求库的补丁版本。无需启动单独的模块。

celery -P eventlet 为您提供 celery 作业并发性。他们可能会也可能不会调用 eventlet.monkey_patch() 来使所有代码兼容。他们将来也可能会改变它。明确使用补丁版本消除了歧义,同时还提供了有用的文档。

将并发 requests 与阻塞分开是没有意义的。您的 prefork 池也可以使用并发版本。 Eventlet 不会用坏东西毒化东西。