Python Celery - Как вызывать задачи из сельдерея внутри другой задачи

Я вызываю задачу в рамках задач в Джанго-Селери

Вот мои задачи.

@shared_task
def post_notification(data,url):
    url = "http://posttestserver.com/data/?dir=praful" # when in production, remove this line.
    headers = {'content-type': 'application/json'}
    requests.post(url, data=json.dumps(data), headers=headers)


@shared_task
def shipment_server(data,notification_type):
    notification_obj = Notification.objects.get(name = notification_type)
    server_list = ServerNotificationMapping.objects.filter(notification_name=notification_obj)

    for server in server_list:
        task = post_notification.delay(data,server.server_id.url)
        print task.status # it prints 'Nonetype' has no attribute id

Как я могу вызвать задачу внутри задачи? Я где-то читал, что это можно сделать с помощью group, но я не могу сформировать правильный синтаксис. Как мне это сделать?

Я пробовал это

for server in server_list:
    task = group(post_notification.s(data, server.server_id.url))().get()
    print task.status

Бросает предупреждающее высказывание

TxIsolationWarning: Polling results w│                                                                        
ith transaction isolation level repeatable-read within the same transacti│                                                                        
on may give outdated results. Be sure to commit the transaction for each │                                                                        
poll iteration.                                                          │                                                                        
  'Polling results with transaction isolation level '

Не знаю что это такое!!!

Как мне решить мою проблему?

3 ответа

Решение

Это должно работать:

celery.current_app.send_task('mymodel.tasks.mytask', args=[arg1, arg2, arg3])

Вы правы, потому что каждая задача в вас for цикл будет перезаписан task переменная.

Ты можешь попробовать celery.group лайк

from celery import group

а также

@shared_task
def shipment_server(data,notification_type):
    notification_obj = Notification.objects.get(name = notification_type)
    server_list = ServerNotificationMapping.objects.filter(notification_name=notification_obj)


    tasks = [post_notification.s(data, server.server_id.url) for server in server_list]
    results = group(tasks)()
    print results.get() # results.status() what ever you want

Вы можете вызвать задачу из задачи, используя функцию задержки

from app.tasks import celery_add_task
    celery_add_task.apply_async(args=[task_name]) 

... это будет работать

Другие вопросы по тегам