2014-02-17 5 views
5

Я звоню задачу в пределах задач в Django-сельдерееPython Сельдерей - Как назвать задачи сельдерея внутри другой задачи

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

@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 ' 

не знаю, что это !!!

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

+0

= task.delay' /' task.apply_async' дает 'объект AsyncResult'. Это поддерживает атрибут опроса '.status', который каждый раз, когда его доступ будет проверять состояние задачи. Нет смысла вызывать .state сразу после того, как вы отправили задачу, потому что шансы на то, что рабочий еще не начал ее выполнять. В следующем примере вы вызываете 'task = ..... get(). Status', который не будет работать, потому что вы вызываете статус возвращаемого значения задачи, а не результат (result.status vs result.get() .положение дел). – asksol

+0

Наконец, вы не должны ждать результата подзадачи, потому что это может привести к взаимоблокировкам, вместо этого вы должны использовать задачу обратного вызова: '(post_notification.s() | do_sometihing_after_posted.s()). Delay()'. См. Http://docs.celeryproject.org/en/latest/userguide/tasks.html#avoid-launching-synchronous-subtasks и http://docs.celeryproject.org/en/latest/userguide/canvas.html – asksol

ответ

5

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

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

Что такое my_model и current_app? – PythonEnthusiast

+0

'current_app' - свойство модуля сельдерея. 'mymodel.tasks' - это путь к вашему' tasks.py'. Измените его, если необходимо. –

+0

Итак, я должен сделать что-то вроде этого: task = celery.current_app.send_task ('mymodel.tasks.mytask', args = [arg1, arg2, arg3]) ' – PythonEnthusiast

0

можно назвать задачу из задачи с помощью функции задержки

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

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

+0

I уже пробовал, чтобы – PythonEnthusiast

+0

@ user1162512 попытался использовать эту работу 4 меня –

2

Вы правы, потому что каждая задача в вы 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 
Смежные вопросы