在 Celery 中,我正在运行一个主任务,它为从查询中获得的每个项目运行一个子任务。子任务应该并行运行。在 UI 上,我有一个进度条,显示总共完成了多少子任务。我正在更新主要任务状态以将信息提供给进度条。我的问题是主要任务在将所有子任务推送到代理后立即结束,因此我无法再更新他的状态。我希望主要任务可以等到所有子任务完成。是否可以?还有其他解决方案吗?这是我的伪代码(真实代码不使用全局 ;-))。
total = 0
done = 0
@task(ignore_result=True)
def copy_media(path):
global total, done
copy_media.update_state(state=STARTED, meta={'total': total, 'done': done})
documents = Document.objects.all()
total = documents.count()
copy_media.update_state(state=STARTED, meta={'total': total, 'done': done})
for document in documents:
process_doc.delay(document, path, copy_media)
@task(ignore_result=True)
def process_doc(document, path, copy_media):
global total, done
# Do some stuff
done += 1
copy_media.update_state(state=STARTED, meta={'total': total, 'done': done})