同时执行(或队列)任务集

时间:2017-12-26 15:09:49

标签: multithreading asynchronous celery

我的情况如下:

  • 5到20个测试环境,由5个VM分隔成组(通常1个设备= 5个VM)
  • 应在1个VM集上同时执行的数百个测试用例。
  • 芹菜与5名工人(每个工作人员为1个VM项目来自VM&#39>集: alpha beta charlie ,< strong> delta , echo

测试集可以以不同的顺序运行并使用diff。执行的时间量。 每个worker只应执行一个没有重叠或并发的测试用例。 每个工作程序仅从其自己的队列/使用者运行任务。

在以前的版本中,我有一个多处理解决方案,它工作正常。但是对于Celery,我无法从一组中为所有5VM添加所有100个测试用例,它只会开始为VM alpha 添加任务,并等待它们全部完成以启动下一个VM的任务 beta 等等。

现在,当我尝试使用多处理为每个工作者创建单独的线程时: AssertionError:不允许守护进程生成子进程

问题是 - 如何同时为5名工人添加100项测试?

因此,每个工作人员(来自 alpha beta ,...)将同时运行自己的100个测试用例集。

1 个答案:

答案 0 :(得分:0)

可以使用基于每个消费者的任务键来解决此问题,例如:

app.control.add_consumer(
    queue='alpha',
    exchange = 'local',
    exchange_type = 'direct',
    routing_key   = 'alpha.*',
    destination = ['worker_for_alpha@HOSTNAME'])

现在,您可以使用密钥和队列名称向此使用者发送任何任务以使用单独的工作人员:

@app.task(queue='alpha', routing_key = 'alpha.task_for_something')
def any_task(arg_1, arg_2):
    do something with arg_1 and arg_2

现在,您可以将其扩展到单个工作人员的任意数量的工作人员或消费者。只需制作一个集合,然后逐个为多个工人\消费者提供它们。

使用每个工作人员的 - 并发 选项可以解决另一个问题。 您可以将并发设置为5,以便在一个worker上同时拥有5个线程。或者使用唯一键和使用者(队列)为每个工作者在单独的线程上中断任务流。