我应该在 celery 中使用 prefork、eventlet 或 gevent 哪个池类?

Posted

技术标签:

【中文标题】我应该在 celery 中使用 prefork、eventlet 或 gevent 哪个池类?【英文标题】:Which pool class should i use prefork, eventlet or gevent in celery? 【发布时间】:2017-08-14 09:13:18 【问题描述】:

我有 3 个远程工作人员,每个工作人员都使用默认池(prefork)和单个任务运行。

单个任务需要 2 到 5 分钟才能完成,因为它在许多不同的工具上运行并在 ELK 中插入数据库。

工人命令: celery -A 项目工作者 -l 信息

我应该使用哪个池类来加快处理速度?

还有其他方法可以提高性能吗?

【问题讨论】:

你应该在你的工作中测试所有这三个并使用最适合的一个。 【参考方案1】:

有趣的是这个问题滚动了。

我们刚刚从 eventlet 切换到 gevent。 Eventlet 导致代理连接挂起,最终使工作人员停滞不前。

一般提示:

如果您受 I/O 限制,请使用更高的并发,我会从 25 开始,检查 cpu 负载并从那里调整,目标是该进程的 cpu 使用率为 99.9%。 如果您的员工人数增加,您可能希望使用 --without-gossip 和 --without-mingle。 不要使用 RabbitMQ 作为结果后端(redis ftw!),但是当涉及到代理时,RabbitMQ 是我们的首选(redis 上的 amqp 仿真和 celery 的 hacky async-redis 解决方案很臭,并导致我们过去有很多悲伤)。

调整芹菜工人的更高级选项:

将每个工作进程固定到一个核心,以避免移动进程的开销(任务集是您的朋友) 如果一名工作人员并不总是在工作,考虑与一两个其他进程共享核心,如果一个进程具有优先级,则使用 nice

【讨论】:

【参考方案2】:

我在 django 项目中使用 celery。 使用 eventlet 时出现很多错误,例如

dns timeout

eventlet==0.25.2

另一个错误:

GreenSSLSocket does not have a public constructor

eventlet==0.22.0。好伤心。

所以我将 eventlet 替换为 gevent==20.6.2,一切正常

【讨论】:

以上是关于我应该在 celery 中使用 prefork、eventlet 或 gevent 哪个池类?的主要内容,如果未能解决你的问题,请参考以下文章

celery 进阶使用篇

Django--队列2

我应该在 Django 项目中使用 Celery 还是 Carrot?

Celery 子进程是不是应该出现在 ps aux 中?较少的

芹菜任务应该在工人迷路时排队

如何调试在 Eclipse 中本地运行的 Celery/Django 任务