如何在Windows上运行Celery?

50
如何在Windows上运行celery worker而不创建Windows Service?是否有类似于“$ celery -A your_application worker”的方法?
13个回答

76

Celery 4.0+ 官方并不支持 Windows 系统。但是对于某些开发/测试目的,它仍然可以在 Windows 上运行。

可以使用以下方式来替代: eventlet


Use eventlet instead as follows:

pip install eventlet
celery -A <module> worker -l info -P eventlet

我在window 10 + celery 4.1 + python 3的环境下测试,发现此方案可以解决以下异常:

This solution

[2017-11-16 21:19:46,938: ERROR/MainProcess] Task handler raised error: ValueError('need more than 0 values to unpack',)
Traceback (most recent call last):
  File "c:\users\wchen8\work\venv\weinsta\lib\site-packages\billiard\pool.py", line 358, in workloop
    result = (True, prepare_result(fun(*args, **kwargs)))
  File "c:\users\wchen8\work\venv\weinsta\lib\site-packages\celery\app\trace.py", line 525, in _fast_trace_task
    tasks, accept, hostname = _loc
ValueError: need more than 0 values to unpack

===== 更新 2018-11 =====

Eventlet 在 subprocess.CalledProcessError 方面存在问题:

https://github.com/celery/celery/issues/4063

https://github.com/eventlet/eventlet/issues/357

https://github.com/eventlet/eventlet/issues/413

所以尝试使用 gevent 替代。

pip install gevent
celery -A <module> worker -l info -P gevent

在我的设备上,以下配置可以正常工作:window 10celery 4.2python 3.6


1
这也适用于gevent和solo并发池实现(在Windows 10和Celery 4.2.1上进行了测试):请参见https://github.com/ZoomerAnalytics/celery-4-windows获取示例代码。 - Bjoern Stiel
2
不错!在 Windows Server 12,Python 3.7.1,Celery 4.2.1 和 Gevent 1.3.7 环境下运行(有点小问题)。对我来说唯一的问题是监控这些 Worker。celery *** inspect active 在启动 Worker 后最初可以正常工作,然后大约 5 分钟后就无响应了,目前还不清楚为什么(在 Python 3.3.5,Celery 4.1.0 和 Eventlet 0.22.1 下没有此问题)。 - pangyuteng
1
将来的读者,我遇到的问题在这里讨论:https://github.com/celery/celery/issues/4817 看起来解决方法是设置 CELERY_BROKER_HEARTBEAT = 0 - pangyuteng
这适用于并发请求场景到celery worker吗? - sattva_venu

29

该链接指向一个不存在的页面。 - Renier
使用3.1.25版本时,出现了ValueError: not enough values to unpack (expected 3, got 0)的错误。 - pelos
它适用于Celery 4.0及以上版本,也适用于Windows操作系统,您只需要在创建Celery实例之前启用多进程环境变量即可。 - sattva_venu
无法安装版本3.1.25,安装过程中出现错误:anyjson设置命令中的错误:use_2to3无效。 - GooDeeJAY

17

使用 --pool=solo 参数编译 Celery。

例如:celery -A your-application worker -l info --pool=solo


1
请问您能解释一下为什么这个方法可以解决问题吗? - Fusion

8
有两种解决方案使Celery 4在Windows上正常工作:
  • 使用eventlet、gevent或solo并发池(如果您的任务是I/O而非CPU绑定的)
  • 设置环境变量FORKED_BY_MULTIPROCESSING=1(这实际上是导致底层billiard包在Windows下失败的原因,自版本4开始)
更多详情请查看 https://www.distributedpython.com/2018/08/21/celery-4-windows

选择第二个选项会有什么后果?我仍然无法成功地在任务执行后revoke()它... - Shmack

7

我已经使用RabbitMQ服务器运行了celery任务。相比于Redis代理,RabbitMQ更加优秀和简单。

在运行celery时,请使用以下命令 "celery -A 项目名称 worker --pool=solo -l info",避免使用以下命令 "celery -A 项目名称 worker --loglevel info"。


对于 -P 单独选项,如果任务需要较长时间,例如约 2 小时左右,在 Windows 上会出现连接重置错误。 - sattva_venu

7

Celery 4.0+目前并不官方支持Windows。但对于某些开发/测试目的,仍可在Windows上使用。

你可以使用以下其中之一:

celery worker --app=app.app --pool=eventlet --loglevel=INFO

celery worker --app=app.app --pool=gevent --loglevel=INFO

celery worker --app=app.app --pool=solo --loglevel=INFO

或者使用其他格式:
celery -A <app> worker --loglevel=info -P eventlet

celery -A <app> worker --loglevel=info -P gevent 

celery -A <app> worker --loglevel=info -P solo

如果你遇到了 context 错误,那么请升级 gevent 到 20.6.2 版本,升级 eventlet 到 0.26.1 版本,或者使用 solo
参考链接:https://www.distributedpython.com/2018/08/21/celery-4-windows/

如果启用了多进程环境变量,则无需指定pool到eventlet、gevent或solo。对于celery 4.0及以上版本,在Windows上也可以使用默认池。 - sattva_venu

6

这个操作和在Linux中一样。进入包含celery任务的模块目录,然后调用"c:\python\python" -m celery -A module.celery worker即可。


1
你需要修复一些错别字。此外,在使用celery之前,你不需要调用python。如果你的PYTHONPATH正确设置,只需执行celery -A tasks worker -l info即可。 - Moses Koledoye
你指的是哪些打字错误? - nicks
1
Python(Python),Worker(Worker)。我认为这样做可以更好地帮助那些有同样问题的人。 - Moses Koledoye
3
PYTHONPATH不就是用来处理import语句的吗?如果没有将Python\Scripts目录添加到PATH中或调用python -m,那么怎样才能找到Celery二进制文件呢? - Baris Demiray

6

你可以使用线程在Windows上运行celery,而不需要额外的库。

celery -A 你的应用程序 worker -P threads


2
这将禁用多个进程。所有工作程序将在同一个进程中运行。如果您想要快速并发,这是很好的选择,但如果任务需要大量CPU,则它们会相互干扰。 - nurettin

5

您仍然可以在Windows 10+上使用celery 4.0+,只需使用此命令“celery -A project worker --pool=solo -l info”而不是“celery -A project worker -l info”。


针对 -P 单机选项,如果任务持续时间较长,例如约 2 小时左右,在 Windows 上会发生连接重置错误。 - sattva_venu

1

在使用Windows上的Celery 4.4让我感到无比绝望后,我认为我可以回答这个问题。

对于4.0及以上版本的Celery,在创建Celery实例之前,首先在Python代码中设置以下环境变量。

os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')

然后使用默认池选项运行celery worker命令。

celery worker -A <celery_file> -l info

这将同时运行多个子进程的celery worker。

注意:当您使用geventeventlet池运行celery时,它可以工作,但在Windows上不会运行并发进程。


选择第二个选项有什么后果?我仍然无法成功执行 revoke() 以撤销已执行的任务... - Shmack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接