Приветствую,
задача состоит в ожидании выполнения всех тасков с дальнейшим ответом клиенту, пример кода для более конкретного понимания
@task(base=NotifierTask)
first(*args):
# runs some time
return json_resp
@task(base=NotifierTask)
second(*args):
# runs some time
return json_resp
@task(base=NotifierTask)
third(*args):
# runs some time
return json_resp
# На этот урл идет запрос
# количество выполнения ф-ций может варьироваться в зависимости от запроса
# может выполниться от 1 до 40 ф-ций
def main(request):
# there we get some data
data = request.POST.get('data')
for some_func in data:
if some_func == 'first':
first.delay(args)
elif some_func == 'second':
second.delay(args)
elif some_func == 'third':
third.delay(args)
# Все это дело попадает на воркер селери
# Notifier Task
class NotifierTask(Task):
"""
Tasks that sends notification on completion.
"""
abstract = True
def after_return(self, status, retval, task_id, args, kwargs, einfo):
# Получаем результат выполнения и прокидываем через сокет на сторону клиента
Задача состоит в получение результата выполнения всех ф-ций, чтобы в дальнейшем сформировать ответ для пользователя.
Предназначение ф-ции
main только в принятии запроса от пользователя, быстрое распределение задач по воркерам и ответ без ожидания их выполнения.
Какие варианты можете посоветовать?
Использование
celery group
При тесте выполнение тасков ведет себя не предсказуемо
@task(base=NotifierTask)
def celery_test(id, position):
time.sleep(id)
return "Time delay: %s, Position: %s" % (str(id), str(position))
def some_request(request):
from django.http import JsonResponse
if request.method == 'GET':
# tasks_list = []
# count = 0
# while count < 10:
# count += 1
# tasks_list.append(celery_test.s(count))
#
# job = group(tasks_list)
job = group([
celery_test.s(10, 1),
celery_test.s(2, 2),
celery_test.s(2, 3),
celery_test.s(2, 4),
celery_test.s(5, 5),
])
job.apply_async()
return JsonResponse(dict(success='Done'))
Результат выполнения
Видно что таск с id=10 выполнился мгновенно, без задержки и по результатам его значение суммировалось к остальным.
Чем объясняется такое поведение или же я что-то не верно делаю?
Выходит что таски сохраняют порядок выполнения заданный в group, это видно по flower и логу воркера