简体   繁体   English

如何使用Celery顺序执行独立任务?

[英]How to execute independent tasks sequentially using Celery?

I have to schedule some tasks which seem very complex to run in parallel. 我必须安排一些看起来很复杂的任务才能并行运行。 They do not depend on the result of each other and the function expects 3 arguments. 它们不相互依赖,函数需要3个参数。

I already tried using chain, map and starmap methods. 我已经尝试使用chain,map和starmap方法。 With chain I get this error: 与链我得到这个错误:

[2019-04-23 15:28:00,991: ERROR/PoolWorker-3] Task proj.apps.tasks.generate[112a7426-5ac3-4cd6-8416-5591c3c018a3] raised unexpected: TypeError('get expected at least 1 arguments, got 0',)
Traceback (most recent call last):
  File ".../local/lib/python2.7/site-packages/celery/app/trace.py", line 367, in trace_task
    R = retval = fun(*args, **kwargs)
  File ".../local/lib/python2.7/site-packages/celery/app/trace.py", line 622, in __protected_call__
    return self.run(*args, **kwargs)
  File ".../tasks.py", line 966, in generate
    return res.get()
TypeError: get expected at least 1 arguments, got 0

Using map I cannot pass all the arguments and with starmap all the tasks are started simultaneously. 使用map我无法传递所有参数,而使用starmap所有任务将同时启动。

[2019-04-23 15:48:00,991: INFO/MainProcess] Received task: generate[..]
[2019-04-23 15:48:00,991: INFO/MainProcess] Received task: generate[..]
[2019-04-23 15:48:00,991: INFO/MainProcess] Received task: generate[..]

An example of the task: 任务示例:

@shared_task
def generate(field1, field2, field3=None):
   if field3 is not None:
      return field1 + field2 + field3
   return field1 + field2

Code using chain: 使用链的代码:

res = chain(generate.s(i, 5, j) for i in array1 for j in array2)
return res.get()

Code using starmap: 使用星图的代码:

arguments = [(i, 4, j) for i in array1 for j in array2]
~generate.starmap(arguments)

if the tasks are truly independent, you should be using .si and not .s : 如果任务是真正独立的,则应使用.si而不是.s

tasks = chain(generate.si(i, 5, j) for i in array1 for j in array2)
res = tasks()
return res.get()

All I needed to do was to make a chain, as below: 我需要做的只是制作一条链,如下所示:

res = chain(generate(i, 2, j)for i in array1 for j in array2)()
return res.get()

and then run celery with a additional argument that sets the maximum number of threads 然后使用设置最大线程数的附加参数运行celery

celery -A tasks worker --concurrency=1

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM