Как получить вызов нескольких задач и собрать статус задачи с Django / Celery - PullRequest
0 голосов
/ 21 декабря 2018

Я устанавливаю несколько задач в моем tasks.py и вызываю задачи из views.py.Я хочу вызывать все различные задачи в цикле for, чтобы я мог легко собирать статус и строить индикатор выполнения.Я могу вызывать все задачи построчно в настоящее время (как показано ниже).

Вот мои вопросы: как мне вызвать различные задачи из views.py в цикле for?это всегда дает мне ошибку "Unicode не имеет атрибута delay ()".Или есть лучший способ для сбора статусов различных задач и построения индикатора выполнения из них?

Я попытался вызвать функции в views.py так: для i в диапазоне (1, 6): functionName = "Вычисление" + str (i) functionName.delay (accountNumber) Но это выдает ошибку, как указано выше "Unicode не имеет атрибута delay ()"

Я предполагаю, что задачи импортируются изtasks.py to views.py

мои текущие tasks.py:

@shared_task
def calculation1(arg):
     some action here

@shared_task
def calculation2(arg):
    some action here

@shared_task
def calculation3(arg):
    some action here

@shared_task
def calculation4(arg):
    some action here

@shared_task
def calculation5(arg):
    some action here

мои views.py:

result_calculation1= calculation1.delay(accountNumber)
result_calculation2 = calculation2.delay(accountNumber)
result_calculation3 = calculation3.delay(accountNumber)
result_calculation4= calculation4.delay(accountNumber)
result_calculation5 = calculation5.delay(accountNumber)

Я хочу собрать все статусы задачв цикле for, поэтому я могу построить индикатор выполнения, но если есть какие-либо иные рекомендации по сбору статуса задачи и созданию индикатора выполнения, это здорово.

Большое спасибо за помощь заранее.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Вам нужно использовать getattr() для извлечения функций из модуля tasks.py после того, как вы создали имена:

from myapp import tasks  # Make sure you import the tasks module

for i in range (1, 6): 
    functionName = "calculation" + str(i)  
    task = getattr(tasks, functionName)  # Get the task by name from the tasks module

После того, как вы получили функцию задачи, вы можете создатьсписок подписей:

signatures = []
signatures.append(task.s(accountNumber))  # Add task signature

Из подписей вы можете создать группу и выполнить группу в целом:

from celery import group

task_group = group(signatures)
group_result = group()  # Execute the group

А из group_result вы можете получить доступ к каждому человекуЗадача результата и построить индикатор выполнения вокруг этого (возможно, повторяя результаты в group_result и проверяя каждый результат status):

for result in group_result:
    status = result.status
    # Your progress bar logic...

Собирая все вместе:

from celery import group
from myapp import tasks  # Make sure you import the tasks module

signatures = []

for i in range (1, 6): 
    functionName = "calculation" + str(i) 
    task = getattr(tasks, functionName)  # Get the task from the tasks module
    signatures.append(task.s(accountNumber))  # Add each task signature

task_group = group(signatures)
group_result = group()  # Execute the group

for result in group_result:
    status = result.status
    # Your progress bar logic...
0 голосов
/ 21 декабря 2018

вы можете поместить задачи в группу и получить GroupResult .Вы можете обратиться к документ сельдерея

...