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})
"다른 작업 결과를 기다리는 작업을 수행하는 것은 실제로 비효율적이며 작업자 풀이 모두 소모되면 교착 상태가 발생할 수 있습니다. 대신 콜백을 사용하여 디자인을 비동기로 만듭니다. " http://celery.readthedocs.org/en/latest/userguide/tasks.html#task-synchronous-subtasks – antoinet
내 주요 작업'copy_media'는 다른 작업의 결과를 기다리지 않습니다. 계속해서 상태를 업데이트하여 얼마나 많은 하위 작업이 완료되었는지 보여줍니다. 하위 작업은 병렬로 실행되므로 콜백 옵션이 없습니다. 그것의 꼭대기에 나는'copy_media'가 한 번에 하나씩 만 실행될 수 있기 때문에 교착 상태를 가질 수 없기 때문에 1 명의 작업자를 차단하고 있습니다. – Etienne
다른 작업의 결과를 효과적으로 기다리고 있습니다. results.ready()를 호출 중이며 다른 테스트 작업도 있습니다. 작업자가 고갈되면 교착 상태가 발생하여 하위 작업이 실행되지 않으며 주 작업이 완료되지 않습니다. – rsalmei