我正在使用Python3和芹菜进行可并行执行的任务。我喜欢将它分成几个块,因此可以节省通过网络进行通信的成本。但是,芹菜文档没有透露有关如何调用结果块的足够详细信息。尝试了不同的方式,他们没有像我预期的那样工作。我的代码段如下:
@app.task(name='pl.startregret')
def startregret(**kwargs):
items = list(zip(range(1000), range(1000)))
chunk = regretclick.chunks(items, 10)
print(chunk)
for c in chunk:
print(c)
@app.task(name='pl.regretclick')
def regretclick(x,y):
print('got it.')
return x + y
我读了一些代码,并认为我的代码中的块应该是一个生成器。但是,打印输出显示
[2014-10-15 13:12:15,930: WARNING/Worker-2] args
[2014-10-15 13:12:15,931: WARNING/Worker-2] subtask_type
[2014-10-15 13:12:15,931: WARNING/Worker-2] kwargs
[2014-10-15 13:12:15,931: WARNING/Worker-2] immutable
[2014-10-15 13:12:15,931: WARNING/Worker-2] options
[2014-10-15 13:12:15,931: WARNING/Worker-2] task
关于正确调用块的正确方法的任何建议?
谢谢,
更新: 我已经阅读了源代码并尝试了chunk()。看起来现在唯一的问题是使用默认队列而不是celeryconfig中定义的队列。
答案 0 :(得分:0)
考虑一个像这样的简单添加任务。
@app.task()
def add(x, y):
return x + y
这是一种调用块任务的简单方法。
res = add.chunks(zip(range(10), range(10)), 2)()
将给定的10个任务分块到每个大小2的5个任务,并将chunked tasks
添加到默认队列。如果要将其路由到不同的队列,则必须在调用任务时指定它。
res = add.chunks(zip(range(10), range(10)), 2).apply_async(queue='my_special_queue')
然后启动此队列的worker以使用任务
worker -A your_app worker -l info -Q my_special_queue