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

2024-09-27 02:27:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须安排一些看起来很复杂的任务并行运行。它们不依赖于彼此的结果,函数需要3个参数。在

我已经试过使用链式,地图和星图方法。有了链条,我得到了这个错误:

[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

使用map我不能传递所有参数,而使用starmap可以同时启动所有任务。在

^{pr2}$

任务示例:

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

使用链的代码:

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

使用星图编码:

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

Tags: inpyfor参数getreturnlinetrace
2条回答

如果任务是真正独立的,则应该使用.si,而不是{}:

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

我只需要做一个链子,如下所示:

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

然后使用设置最大线程数的附加参数运行celeri

^{pr2}$

相关问题 更多 >

    热门问题