我一直致力于一个项目,该项目要求尽可能以并行方式执行某些任务。下面的代码举例说明了问题:
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from celery.app import Celery
from celery.utils.log import get_task_logger
logger = get_task_logger(__name__)
app = Celery('celeryproject', backend="redis://localhost:6379/0", broker="amqp://guest:guest@localhost:5672//")
@app.task
def step1(x):
# get a list of str from a webservice using x
return ["step1-%s-%s" % (x, i) for i in range(5)]
@app.task
def step2(y):
# get a list of str from a webservice using x
return ["step2-%s-%s" % (x, i) for i in range(5, 10)]
@app.task
def step3(z):
# process the z
logger.info(z)
@app.task
def pipeline(xs):
for x in xs:
r1_list = step1.delay(x).get()
for r1 in r1_list:
r2_list = step2.delay(x, r1).get()
for r2 in r2_list:
step3.delay(r2)
我需要执行task.pipeline来启动该过程。我尝试了一些Canvas Workflow示例(http://docs.celeryproject.org/en/latest/userguide/canvas.html)但是我遇到了一些问题。伙计们,能帮助我吗?
编辑: Step1返回一个列表,我想处理Step2中列表的每个元素。这也返回一个列表,我想处理Step3中列表的每个元素。
我想为Step1返回的每个元素应用Step2,并为之前返回的每个元素应用Step3。
我试过,例如: 弦(step1.s(' XXX'))(step2.map())
但是我得到了错误:
TypeError('map() takes exactly 2 arguments (1 given)',)
也尝试使用群组,但它没有用。