Сельдерейный аккорд, выполнение кода после обратного вызова
Я работаю над Django-приложением, которое использует задачи celery для сложных и трудоемких вычислений. У меня есть задача, в которой подзадачи используются для обработки большого количества комбинаций значений и определения наилучшей комбинации на основе предопределенных параметров. Подзадачи создаются следующим образом:
combinations = itertools.product(*bm)
# setup for multicore processing using celery tasks
static_args = (nt, mp, f, levels)
chunk_size = 10000
tasks = _chunked(combinations, chunk_size)
chunk_tasks = group(evaluate_combination_chunk.s(list(chunk), static_args) for chunk in tasks)
final_task = compare_chunk_results.s()
best_result = chord(chunk_tasks)(final_task)
# do some stuff with this result
return best_result
методы подзадач выглядят следующим образом:
def evaluate_combination_chunk(chunk, static_args):
# evaluate a chunk of combinations
best_result = None
highest_power = -1
for comb in chunk:
result = evaluate_combination(comb, *static_args)
if result[0] and result[1] > highest_power:
best_result = result
highest_power = result[1]
return best_result
и
def compare_chunk_results(results):
best_result = None
highest_power = -1
for result in results:
if result:
if result[1] > highest_power:
best_result = result
highest_power = result[1]
return best_result
оба помечены @shared_task(). Таким образом, я нахожу лучший результат в каждом чанке (который работает просто отлично, основываясь на том, что я вижу в консоли), а затем сравниваю их, чтобы найти лучший результат из всех чанков. Моя проблема заключается в том, что я хочу взять этот best_result, сделать с ним что-то и затем вернуть это родительской задаче. но я не могу запустить код после best_result = chord... потому что выполнение кода не ждет завершения всех задач и обратного вызова chord, я не могу найти решение этой проблемы, поэтому любая помощь была бы очень признательна. Спасибо!