【发布时间】:2016-09-21 03:46:47
【问题描述】:
对于 gevent pool,我们可以使用参数 '-c' 来指定 greenlet 编号。如下所示。
celery worker -A celerytasks.celery_worker_init -P gevent -c 1000 --loglevel=info
但它的适当价值是什么?
“greenlet number”的真正含义是什么?如果我指定1000个greenlets,如果用完会怎样?
【问题讨论】:
对于 gevent pool,我们可以使用参数 '-c' 来指定 greenlet 编号。如下所示。
celery worker -A celerytasks.celery_worker_init -P gevent -c 1000 --loglevel=info
但它的适当价值是什么?
“greenlet number”的真正含义是什么?如果我指定1000个greenlets,如果用完会怎样?
【问题讨论】:
-c 参数是一个 Celery 参数,允许您指定从工作人员同时执行多少个任务,以下是文档的摘录:
可以使用 --concurrency 参数更改工作进程/线程的数量,默认为机器上可用的 CPU 数量。
当运行 celery 并指示使用 gevent 时,这意味着不是使用 prefork celery 而是使用绿色线程来处理您的任务。 在这种情况下,您可以参考这个关于 eventlet on celery docs 的页面,它与 gevent 不同,但适用相同的概念。
这里有一段可以帮助你理解的摘录:
prefork 池可以使用多个进程,但多少通常限制为每个 CPU 几个进程。使用 Eventlet,您可以高效地生成数百或数千个绿色线程。
但是请注意,gevent 或 eventlet 并不总是比 prefork 更好,通常取决于您需要执行的任务类型,如文档的这一部分所述:
Celery 支持 Eventlet 作为替代的执行池实现。在某些情况下它优于 prefork,但您需要确保您的任务不执行阻塞调用,因为这将停止工作器中的所有其他操作,直到阻塞调用返回。
关于尺寸标注很难回答,因为这也很大程度上取决于您的任务类型和平均负载。 以我个人的经验,一个芹菜工人的价格通常不要超过 1000-3000。
最后一点,来自 celery docs 看起来 gevent 仍在 experimental state 中,您可能想改用 eventlet。
【讨论】: