Celery启动命令行中gevent greenlet的合适数量是多少

问题描述 投票:0回答:1

对于 gevent 池,我们可以使用参数“-c”来指定 greenlet 编号。如下所示。

celery worker -A celerytasks.celery_worker_init -P gevent -c 1000 --loglevel=info

问题:

  1. 它的合适值是多少?

  2. “格林莱特数”的真正含义是什么?

  3. 如果我指定 1000 个 greenlet,如果它们用完会发生什么?

python celery gevent
1个回答
2
投票

-c
参数是一个 Celery 参数,允许您指定从工作线程中同时执行多少个任务,以下是文档的摘录:

可以使用 --concurrency 参数更改工作进程/线程的数量,默认为计算机上可用的 CPU 数量。

当运行 celery 并指示使用 gevent 时,这意味着 celery 将使用绿色线程来处理您的任务,而不是使用 prefork。 在这种情况下,您可以参考有关 celery 文档上的 eventlet 的页面,与 gevent 不同,但适用相同的概念。

这里摘录可以帮助您理解:

预分叉池可以使用多个进程,但数量通常仅限于每个 CPU 的几个进程。使用 Eventlet,您可以有效地生成数百或数千个绿色线程。

但是请注意,gevent 或 eventlet 并不总是比 prefork 更好,通常取决于您需要执行的任务类型,如文档这一部分中所述:

Celery 支持 Eventlet 作为替代执行池实现。在某些情况下,它优于 prefork,但您需要确保您的任务不会执行阻塞调用,因为这将停止工作线程中的所有其他操作,直到阻塞调用返回。

关于尺寸很难回答,因为这很大程度上取决于您的任务类型和平均负载。 根据我个人的经验,一名芹菜工人最好不要超过 1000-3000。

最后一点,从 celery 文档来看,gevent 仍处于

实验状态,您可能想使用 eventlet 来代替。

© www.soinside.com 2019 - 2024. All rights reserved.