【问题标题】:Python Celery threads, workers and vCPusPython Celery 线程、worker 和 vCPus
【发布时间】:2014-02-02 21:22:01
【问题描述】:

我们编写了一个应用程序,通过电子邮件向我们客户的超过 200,000 名客户发送账单信息。目前,我们使用批处理程序需要 2 天多的时间才能按顺序发送所有电子邮件。

我们已将整个程序转移到 Celery 上,我们已经看到常规 2 名工人的负载有了显着改善。

有人对 Celery 进行基准测试吗?文档说工人的数量必须等于性能的 CPU 数量。假设我们将服务器虚拟化并在物理 8 核服务器上设置 32 个 vCPU,我们可以在 32 个线程上同时运行它吗?

邮件通过不同的邮件服务器发送,服务器只运行 Rabbit MQ、Celery 和应用程序。请告知正确数量的工作线程和线程以及 vcpus,以避免不必要的排队和延迟。

【问题讨论】:

    标签: python django multithreading rabbitmq celery


    【解决方案1】:

    简短回答:您需要了解自己在做什么,并可能自己衡量

    更长:

    主要问题是您的任务是否受 CPU 限制或 I/O(网络/磁盘)限制。如果您的任务受 CPU 限制(可能是诸如生成模板、图像之类的东西),那么添加工作人员不会得到任何改进。但是,大多数情况下您都在处理 I/O 绑定(网络)任务,并且如果您正在等待网络确认,并且邮件服务器等没有瓶颈,您可能会通过使用更多工作人员来获得更高的结果。

    为了更好地理解这一点,我强烈建议您慢慢浏览 David Beazley 的大开眼界演示:An Introduction to Python Concurrency。这不包括 Celery 和 Tornado,但对底层技术和问题进行了很好的概述,并列出了解决方案(带有示例)。

    【讨论】:

    • 谢谢。没有网络等待。一切都或多或少是 I/O Bound 和 Database bound。vCPus 与并发线程的数量是否有任何比率?我按照你的建议慢慢完成演示
    • 如果它是 SQLDB 绑定的(即,您的任务直接写入数据库,这会导致过程延迟),您可能需要考虑读取创建任务的过程中的所有内容,将其发送到许多工作人员通过事件 Q,并通过消息 Q 结果后端返回结果,稍后由一个顺序数据库写入工作人员将结果写入数据库。通过这种方式,您可以使您的任务 100% 受网络约束并创建更多的工作人员,或者将其重写为完全异步(例如使用龙卷风),并且每个 cpu 使用一个工作人员。无论如何,没有“幻数”,你应该看到幻灯片:-)
    • 如果您的任务是 I/O 绑定的,那么您也可以使用 eventlet/gevent 池:celery worker -l info -P gevent -c 1000。如果你有 32 个 CPU,那么你可以使用 celery multi 来利用它们:celery multi start 32 -P eventlet -c 100 用于 32 个工作进程,每个进程有 100 个并发线程。
    猜你喜欢
    • 2016-09-20
    • 2017-04-02
    • 1970-01-01
    • 2019-11-23
    • 2014-10-18
    • 2020-06-01
    • 2019-05-02
    • 2017-03-21
    • 1970-01-01
    相关资源
    最近更新 更多