我有这种情况:
任务.py
@task
def add(a,b):
return a+b
@task
def other():
chunks = [1,1,1,1] # dummy data
for index in range(3):
# wait for each group to finish then continue to the next one
res = group( add.s(i,i) for i in chunks ).apply_async()
# sleep for 1 second if group is not ready
while not res.get():
time.sleep(1)
这会导致在等待任务组完成时出现死锁吗?即使在只有一个芹菜工人的理论情况下?
您正在等待other
任务中的group
任务的结果。因此,即使只有一个芹菜工人,它也可能导致死锁。
让一个任务等待另一个任务的结果确实效率很低,如果工作池耗尽,甚至可能导致死锁。
注意:这只是Celery 3.1中的一个警告。但从Celery 3.2开始,它将引发一个例外。
因此,最好使您的设计异步。你只需简单的修改就可以做到。
@task
def other():
chunks = [1, 1, 1, 1]
my_tasks = []
for i in range(3):
# delay is shorthand for apply_async.
# using si to make signature immutable,so that its arguments don't change
group_task = group(add.si(i, i) for i in chunks).delay()
# here instead of executing them immediately, lets chain them
my_tasks.append(group_task)
from celery import chain
chain(my_tasks)