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
选项:
- solo
- threads
- gevent
请记住,这些都没有得到官方支持,现在可以用不代表将来一直可以使用,所以最好还是使用Linux来运行 Celery worker
吧。
原文地址:https://celery.school/celery-on-windows