【问题标题】:What is the propriate number of gevent greenlet in Celery startup command lineCelery启动命令行中gevent greenlet的适当数量是多少
【发布时间】: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,如果用完会怎样?

【问题讨论】:

    标签: python celery gevent


    【解决方案1】:

    -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。

    【讨论】:

    • 如果我指定1000个greenlets,如果用完会怎样?
    • worker 不会从 broker 获取额外的消息,让其他负载较小的 worker 获取消息(如果有的话)。否则消息将保留在代理上,直到您的工作人员再次获得新的免费绿色线程。请注意,worker 也可以预取任务docs.celeryproject.org/en/latest/userguide/…
    • 得到它。但是,1000-3000 似乎是一个很大的范围。对于像 Intel Xeon CPU 4 cores 8G RAM 专用服务器这样的机器,greenlets 的好数量是多少?
    • 再一次,这在很大程度上取决于您需要执行的任务,如果您的任务非常小并且执行得非常快并且不使用这么多的内存,那么这个数字就很好了。只有一种方法,试试看吧。
    • 谢谢,毛罗。另一个问题,如果在greenlet中引发了一个未捕获的异常,会发生什么?那个greenlet会死还是它仍然可以处理下一个任务?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2012-12-09
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多