Как использовать результат обратного вызова для сельдерея AsyncTask

1

У меня есть следующая ситуация.

Мой client отправляет работнику следующую задачу:

# client
task = my_task.apply_async((some_params), queue='my_queue')
# task.get()  # This blocks

Мой рабочий выполняет задачу должным образом и возвращает результат.

Таким образом, task.get() результата с помощью task.get() работает, но он блокирует. Теперь то, что я хотел бы иметь, - это обратный вызов, который вызывается, когда доступен результат (успех или неудача).

Существует функция on_success класса Task. Но это используется в работнике. Совлокальный вопрос

Любые идеи или решения?

  • 0
    Использует ли обратный вызов результат? Возможно, для этого хорошо подойдет цепочка или аккорд. docs.celeryproject.org/en/latest/userguide/canvas.html
  • 0
    @sytech да, это так. Но имеет ли это значение? Я могу использовать task.get() чтобы получить результат правильно?
Теги:
rabbitmq
celery

1 ответ

0

Вы можете иметь обратные вызовы с заданием, но это не вызывающий или клиент, который может быть уведомлен или вызван (поскольку сельдерей не работает), это будет другая задача сельдерея, которая должна использоваться в качестве обратного вызова. Если вы хотите использовать обратный вызов, вы можете использовать ссылку на сельдерей или агитацию.

Для простого обратного вызова, использующего результат инициирующей задачи, вы можете сделать следующее:


@app.task
def add(m, n):
    return m + n

@app.task
def callback(result):
    print(f'My result was {result}')

def client_caller():
    add.apply_async(args=(2, 2), link=callback.s())


Ещё вопросы

Сообщество Overcoder
Наверх
Меню