I'm calling a task within a tasks in Django-Celery
Here are my tasks.
@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
How can I call a task within a task?
I read somewhere it can be done using group
, but I'm not able to form the correct syntax. How do I do it?
I tried this
for server in server_list:
task = group(post_notification.s(data, server.server_id.url))().get()
print task.status
Throws a warning saying
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 '
Dont know what it is!!!
How do I solve my problem?
result = task.delay
/task.apply_async
gives anAsyncResult
object. This supports a polling.status
attribute which each time its accessed will check what the state of the task is. It makes no sense to call .state right after you have sent the task because chances are the worker did not start executing it yet. In your later example you calltask = .....get().status
which will not work because you are calling status on the return value of the task, not the result (result.status vs result.get().status). – Jocularity(post_notification.s() | do_sometihing_after_posted.s()).delay()
. See docs.celeryproject.org/en/latest/userguide/… and docs.celeryproject.org/en/latest/userguide/canvas.html – Jocularity