Заставить сельдерей дождаться окончания задания - PullRequest
0 голосов
/ 29 марта 2020

Я хочу, чтобы сельдерей подождал, пока определенная задача c завершится sh, поэтому я установил бэкэнд-результаты сельдерея рядом с самим сельдереем. Но я не понимаю, как мне написать свой вызов задачи, чтобы ждать, пока я получаю следующую ошибку:

example_task() missing 1 required positional argument: 'user_pk'

views.py

def example(request):
    user = request.user
    if request.method == 'GET':
        result = example_taks.apply_async(user_pk=user.pk)
        result_output = result.wait(timeout=None, interval=0.5)
        return redirect('something')
    else:
        args = {'user': user}
        return redirect(reverse('something'), args)

в моих задачах .py:

def example_task(user_pk):
    user = User.objects.get(pk=user_pk)
    try:
       ...

ранее я называл беседы так:

def example(request):
    user = request.user
    if request.method == 'GET':
    example_task.delay(request.user.pk)
    ...

Это работало нормально, но не дожидалось, пока задача завершится sh.

Если я просто сделаю:

result = allocate_new_bch_address.apply_async(request.user.pk)

Я также получаю ошибку:

Аргумент example_task () после * должен быть повторяемым, а не UUID

благодарен за любой совет здесь.

1 Ответ

2 голосов
/ 04 апреля 2020

Во-первых, вы используете apply_async() неправильно. Функция принимает аргументы вашей задачи, упакованные как кортеж (args) и словарь (kwargs), как показано здесь . Это потому, что вы можете указать дополнительные параметры, которые определяют, как должна выполняться задача. С другой стороны, delay() принимает только аргументы вашей задачи и kwargs . delay() достаточно в большинстве случаев.

Вы можете сделать это:

 example_taks.apply_async(kwargs={"user_pk":user.pk})

Или это:

example_tasks.delay(user_pk=user.pk)

Вы также можете использовать позиционные аргументы, но я Рекомендую использовать kwargs, когда это возможно.

Во-вторых, ожидание асинового задания c, как только его отправка нарушает цель Сельдерея. Чтобы дождаться окончания задачи до sh, нужно вызвать get () по результату:

result = example_tasks.apply_async(kwargs={"user_pk":user.pk})
result_output = result.get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...