Celery:长期专用的整体任务与短多项任务

时间:2012-09-06 19:38:04

标签: python rabbitmq celery distributed-computing django-celery

在我的解决方案中,我使用分布式任务来监视硬件实例一段时间(比如10分钟)。我必须在以下时间做一些事情:

  • 我开始此监控会话
  • 我完成了此监控会话
  • (可能)在监控会议期间

在整个会话(10分钟)内运行单个任务并执行所有这些任务是否安全,还是应该将这些操作拆分为自己的任务?

我认为单个任务的优点是管理和实施时序约束会更容易。但是:

运行大量(大多数)睡着的工人是不是一个好主意?例如,如果我知道最多会打开200个会话,我会有500名工作人员,以确保总有可用的“会话”席位吗?

1 个答案:

答案 0 :(得分:10)

这个

没有一个通用的答案
  • 将一个大任务A分成许多小部分(A¹,A²,A³,......)将增加潜在的并发性。

因此,如果您有1个具有10个工作线程/进程的工作器实例, 现在可以使用10个线程而不是按顺序并行运行 在一个线程上。

部件数量称为任务粒度(精细或粗粒度)。

  • 如果任务过于细化,则消息传递的开销会降低性能。

每个部分必须有足够的计算/ IO来抵消发送任务的开销 向代理发送消息,如果没有工作人员可以将其写入磁盘,接收消息的工作人员等等(请注意,可以调整消息传递开销,例如,您可以拥有一个瞬态队列(不是将消息保存到磁盘),并发送那些不那么重要的任务。)

  • 繁忙的群集可能会使所有这一切都无法实现

如果您有一个繁忙的集群,可能已经实现了最大并行度(例如,每个工作室实例包含10个线程/进程,所有正在运行的任务)。

然后你通过划分任务获得了很多好处,但是做I / O的任务比CPU绑定任务有更大的改进机会(由I / O操作拆分)。

  • 长时间运行的任务很好

工作人员不会对长时间的任务过敏,不论是10分钟还是一小时。

但它也不理想,因为任何长时间运行的任务都会阻止该插槽 完成任何等待任务。为了缓解这种情况,人们使用路由,以便您拥有一个专用队列,为必须尽快运行的任务提供专用工作人员。

-