Celery 官方在很久以前就放弃了对
windows 的支持,大约在4.0版本左右。Celery 3是支持
windows 的最后一个版本,而现在
Celery 最新版本已经到了
5.4 。
主要原因是因为
perfork pool 是
Celery 的默认
pool ,
prefork pool 类似于
Python 的
multiprocessing pool ,基于
billiard 以满足
Celery 一些特定的需求。
prefork pool 基于进程的
forking ,但
windows 支持生成进程,而不支持进程
forking 。
那现在使用
windows 应该如何运行呢?有三个方法:
选择1:solo
solo pool (单进程执行) 即在
worker 所在的进程和线程上处理任务,严格来说,他不算一个
pool 。
伪代码:
C:\Dev\celery-demo>celery -A app.app worker -l info -P solo
如果需要更多的并发,可以创建多个单进程执行单元。
选择2:Threads
Threads pool 线程池类型中的线程由操作系统内核直接管理,只要
Python 的
ThreadPoolExector 支持
Windows 线程,这种池类型就可以在
Windows 上工作,推荐使用在IO负载的场景。
伪代码:
C:\Dev\celery-demo>celery -A app.app worker -l info -P threads --concurrency=4
选择3:gevent
gevent pool 通过
Greenlet 实现并发。
Greenlet 类似于
asyncio 中的协程。当一个任务等待它的结果时,它会让给另一个任务来做它的事情。
因为
gevent 包支持
Windows ,只要您了解一些
gevent 的复杂性,
gevent pool 仍然是
Windows 上IO任务处理的合适选项。
伪代码:
C:\Dev\celery-demo>celery -A app.app worker -l info -P gevent --concurrency=4
总结
在本文中,我查看了2024年仍然适用于
Windows 的三个
Celery pool 选项:
请记住,这些都没有得到官方支持,现在可以用不代表将来一直可以使用,所以最好还是使用Linux来运行
Celery worker 吧。
原文地址:https://celery.school/celery-on-windows