使Celery 4在Windows上运行的2种方法

该博客文章中使用的源代码可在GitHub上找到。
自Celery 4.x版本起,Celery不再正式支持Windows。尽管Celery 3确实支持Windows,但它与Celery 4不兼容。因此,如果您必须使用Windows来执行某些(一项)Celery任务,则整个基础架构都将使用传统的Celery版本。这当然是不可接受的情况。

但是,即使Celery放弃了Windows支持,我仍将向您展示两个简单的解决方法,以使Celery 4在Windows上正常播放。

芹菜并发池
使Celery 4在Windows上运行的第一个策略与并发池有关。简而言之,并发池实现决定了Celery worker如何并行执行任务。Celery默认使用prefork实现,该实现会生成进程(并且限于每个CPU少数几个进程),而Eventlet生成线程(其中数百个线程,不会费劲)。

Celery随附多种并发池类型供您选择:

前叉
事件
事态
独奏
Prefork池更适合于CPU绑定的任务,而如果您受I / O约束,则eventlet池更适合工作。深入讨论不同的选项是另一篇博客中另一项任务,在此期间,我建议您查看有关文档并发和并发性Eventlet。

策略1:Windows上的带事件,gevent或solo的芹菜
实际上,使Celery 4与Windows不兼容的原因仅仅是默认的prefork并发池实现。换句话说,如果您要完成的Celery任务可以很好地处理eventlet,gevent或solo(solo是一个阻塞的单线程执行池),则可以在Windows中使用这些执行池中的任何一个运行Celery 4。

克隆GitHub存储库,创建虚拟环境并安装pip要求:

C:\Developer\celery-4-windows>virtualenv celery-4-windows
C:\Developer\celery-4-windows>activate celery-4-windows
(celery-4-windows) C:\Developer\celery-4-windows>pip install -r requirements.txt
您可以使用以下任何池参数启动Celery worker:

(celery-windows) C:\Developer\celery-4-windows>celery worker --app=app.app --pool=eventlet --loglevel=INFO
(celery-windows) C:\Developer\celery-4-windows>celery worker --app=app.app --pool=gevent --loglevel=INFO
(celery-windows) C:\Developer\celery-4-windows>celery worker --app=app.app --pool=solo --loglevel=INFO
打开一个新的命令行窗口以异步执行任务,您的Celery worker重新回到Windows业务:

C:\Developer\celery-4-windows>activate celery-4-windows
(celery-4-windows) C:\Developer\celery-4-windows>python app.py
策略2:FORKED_BY_MULTIPROCESSING
如果我们进行更深入的研究,就会发现默认的prefork并发池实现在Windows上不再起作用的原因是因为Celery台球程序包。Billiard本身是Python mulitprocessing软件包的分支,具有一些修复和改进。

台球FORKED_BY_MULTIPROCESSING=1默认情况下用于设置记录不太好的环境变量。Celery依次检查是否FORKED_BY_MULTIPROCESSING设置为确定是否禁用了分叉(这是操作系统的事情)。由于台球版本Celery 4依赖于台球,因此不再设置台球FORKED_BY_MULTIPROCESSING,这又会导致Windows上的前叉池失败(请查看前叉源代码和台球更改日志)。

简而言之,您可以通过设置Windows环境变量来解决此问题。转到:系统属性=>环境变量=>用户或系统变量=>新建…:

Variable name: FORKED_BY_MULTIPROCESSING
Variable value: 1
打开一个新的命令提示符窗口,以拾取新的环境变量。您可以在不使用pool参数的情况下启动Celery worker:

C:\Developer\celery-4-windows>activate celery-4-windows
(celery-windows) C:\Developer\celery-4-windows>celery worker --app=app.app --loglevel=INFO
打开一个新的命令行窗口以异步执行任务,您的Celery worker只能使用默认的prefork池(实际上是通过多处理来分叉的):

C:\Developer\celery-4-windows>activate celery-4-windows
(celery-4-windows) C:\Developer\celery-4-windows>python app.py
该博客文章中使用的源代码可在GitHub上找到。
注释

你可能感兴趣的:(Django,celery,python)