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