Уведомление или обратный вызов колбы после завершения работы удаленного сельдерея
Я запускаю сельдерейный клиент (Flask) и рабочий на двух разных машинах, теперь, когда рабочий выполнил задачу, мне нужно выполнить обратный вызов функции на стороне клиента. Это возможно?
Клиент сельдерея:-
celery_app=Celery('test_multihost', broker='amqp://test:test@<worker_ip>/test_host', backend='rpc')
result= testMethod1.apply_async((param1, param2,param3), link=testMethod2.s())
@celery_app.task
def testMethod2():
#testMethod2 body.
Сельдерей Рабочий:-
celery_app=Celery('test_multihost', broker='amqp://test:test@<worker_ip>/test_host', backend='rpc')
@celery_app.task
def testMethod1():
#testMethod1 body
Но проблема в том, что функция testMethod2 выполняется на стороне работника сельдерея, а не на стороне клиента.
Есть ли способ обратного вызова метода на стороне клиента?
2 ответа
Я решил эту проблему с помощью @after_task_publish из сигналов сельдерея. Фрагмент кода выглядит следующим образом:-
@after_task_publish.connect(sender=<registered_celery_task>)
def testMethod2(sender=None, headers=None, body=None, **kwargs):
#callback body
TestMethod2 будет вызываться после завершения работы сельдерея на удаленной машине. Здесь я могу получить доступ к результату сельдерея, используя параметр заголовков.
Один из способов сделать это - заставить Celery записать свой результат в таблицу базы данных и использовать Flask для опроса результата задачи, многократно запрашивая базу данных. Похожая конструкция могла бы вести регистр выполненных задач в Redis, но суть была бы такой же.
Вы хотите вызвать сообщение о завершении для пользователя? Если вы можете уведомить по электронной почте / текстовым сообщением, вы, конечно, можете просто позволить Celery справиться с этим.
Если вам нужно запустить какой-то процесс Flask - а он действительно должен по какой-то причине находиться внутри экосистемы Flask - используйте воркер с requests
модуль для вызова конечной точки, которую прослушивает Flask.