在进程上使用Celery并同时执行任务

Hon*_*rek 25 python monkeypatching multiprocessing celery gevent

我想使用Celery作为我的任务的队列,所以我的网络应用程序可以排队任务,返回响应,同时/某天/任务将处理任务...我建立了一种API,所以我不知道将提供什么样的任务 - 将来,可以有处理HTTP请求的任务,另一个IO,以及CPU消耗任务.关于这一点,我想在进程上运行Celery的工作者,因为这些是Python中的通用类型的并行性.

但是,我也想在我的任务中使用gevent,所以我可以有一个任务产生许多HTTP请求,等等.问题是,当我这样做时:

from gevent import monkey
monkey.patch_all()
Run Code Online (Sandbox Code Playgroud)

芹菜停止工作.它开始,但没有任何任务可以有效排队 - 他们似乎去经纪人,但芹菜工人不收集它们并处理它们.只有开始和等待.如果我删除这些行并执行任务而没有任何gevent和并行化,一切正常.

我想这可能是因为gevent补丁也在线程化.所以我试过了

from gevent import monkey
monkey.patch_all(thread=False)
Run Code Online (Sandbox Code Playgroud)

...但是Celery甚至没有启动,它在没有给出原因的情况下崩溃(启用了日志记录的调试级别).

是否有可能使用Celery来排队任务和gevent在一个任务中做一些事情?怎么样?我做错了什么?

myu*_*uf3 20

我相信推荐的启动任务的方法如下.

python manage.py celery worker -P gevent --loglevel=INFO
Run Code Online (Sandbox Code Playgroud)

Gevent需要尽早修补.

  • 这仅适用于Django项目,并且在该问题中没有提到任何Web框架. (4认同)

rem*_*ezx 10

您可以使用包含多个greenlet的多个线程来运行芹菜,如下所示:

$ celery multi start 4 -P gevent -l info -c:1-4 1000
Run Code Online (Sandbox Code Playgroud)