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

What is the propriate number of gevent greenlet in Celery startup command line

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

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

但它的适当价值是多少?

这对 'greenlet number' 意味着什么?如果我指定1000个greenlets,用完了会怎么样?

-c 参数是一个 Celery 参数,允许您指定从 worker 中同时执行多少个任务,这里是文档的摘录:

The number of worker processes/threads can be changed using the --concurrency argument and defaults to the number of CPUs available on the machine.

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

此处摘录可以帮助您理解:

The prefork pool can take use of multiple processes, but how many is often limited to a few processes per CPU. With Eventlet you can efficiently spawn hundreds, or thousands of green threads.

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

Celery supports Eventlet as an alternative execution pool implementation. It is in some cases superior to prefork, but you need to ensure your tasks do not perform blocking calls, as this will halt all other operations in the worker until the blocking call returns.

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

最后一点,从 celery 文档看来 gevent 仍在 experimental state 中,您可能想改用 eventlet。