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

Gor*_*oro 5 python distributed-computing rabbitmq celery django-celery

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

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

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

正如我所看到的,单个任务的优点是管理和实施时序约束会更容易.但:

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

ask*_*sol 10

对此没有一个通用的答案

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

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

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

  • 如果任务太细粒度,则消息传递的开销会降低性能.

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

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

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

然后,许多人通过划分任务得不到多少好处,但是执行I/O的任务比CPU绑定任务(通过I/O操作分割)有更大的改进机会.

  • 长时间运行的任务很好

工人不会对长时间运行的任务过敏,不论是10分钟还是一小时.

但它并不理想,因为任何长时间运行的任务都会阻止该槽完成任何等待任务.为了减轻这种情况,人们使用路由,以便您拥有一个专用队列,其中包含必须尽快运行的任务的专用工作人员.

-