【问题标题】:Does Django Block When Celery Queue Fills?当 Celery 队列填满时,Django 会阻塞吗?
【发布时间】:2014-03-12 23:34:24
【问题描述】:

我正在对我的网络应用程序进行一些指标分析,该应用程序广泛使用了 celery。我有一个度量标准,它测量从 post_save 信号到 celery 任务(它本身调用许多不同的 celery 任务)到该任务结束的完整行程。我在 5 秒内向服务器发送了多达 100 个请求。

我发现有趣的是,当我用数百个请求访问服务器时(这需要数千个 celery 工作进程排队),从保存后到主要 celery 任务结束所花费的时间显着增加,即使我从不进行任何额外的数据库调用,并且任何 celery 任务都不应该阻塞主要任务。

当我很快发出一堆请求时,队列中有这么多 celery 任务会减慢我的 post_save 函数和主要 celery 任务中的逻辑吗?也就是说,与将 celery 主任务创建的子任务放到拥挤的队列中相关的处理是否会对到达主 celery 任务结束所需的时间产生重大影响?

【问题讨论】:

  • 您为 Celery 使用的代理是什么?

标签: python django multithreading rabbitmq celery


【解决方案1】:

如果不对您的实际代码和基准协议进行深入分析,就不可能真正回答您的问题,虽然我对 Python、Django 和 Celery 有一定的工作经验,但我无法进行如此深入的分析.现在有几个非常明显的点:

  1. 如果您的工作人员与您的 Django 实例在同一台计算机上运行,​​他们将与 Django 进程竞争 CPU、RAM 和 IO。

  2. 如果基准测试“客户端”也在同一台计算机上运行,​​那么您就有一个“heisenbench”案例 - 以每秒 100 次 HTTP 请求轰炸服务器也会占用大量资源...

长话短说:并发/并行编程不会为您提供更多处理能力,它只会让您(或多或少)轻松地进行水平扩展。

【讨论】:

    【解决方案2】:

    我不确定是否会放慢速度,但这可能会导致您的应用程序挂起。我遇到过这个问题,一个应用程序会备份几个没有工作人员的其他队列。然后我的应用程序就不能再对消息进行排队了。

    如果您打开 django shell 并尝试将任务排队。然后按 ctrl+c。我不太记得堆栈跟踪应该是什么,但如果你把它贴在这里我可以确认它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-27
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多