2017-02-09 3 views
0

Я не могу понять, почему моя задача считается выполненной до того, как все ее подзадачи выполнены.Celery - задача succedes перед ее подзадачами

tasks.scan_user.delay(1) 

КОД:

@task() 
def scan_chunk(ids): 
    occs = Occurence.objects.filter(product_id__in=ids) 
    result = scan_occurences_dummy_pool((x.id,x.url,x.xpath) for x in occs) 
    return result 

@task() 
def scan_user(id): 
    chunks = generate_chunks_from_user(id) 
    ch = chain(scan_chunk.si([x.id for x in chunk]) for chunk in chunks) 
    return ch() 

Это выход сельдерей, как вы можете видеть, scan_user удалось, прежде всего scan_chunks сделаны, что является проблемой, потому что я хочу scan_user к нам в другом chain.

[2017-02-09 14:27:03,493: INFO/MainProcess] Received task: engineapp.tasks.scan_user[ed358a98-a685-4002-baac-993fdc7b64cf] 
[2017-02-09 14:27:05,721: INFO/MainProcess] Received task: engineapp.tasks.scan_chunk[35b74e01-f9fa-471f-8c20-ecbf99a89201] 
[2017-02-09 14:27:06,740: INFO/MainProcess] Task engineapp.tasks.scan_user[ed358a98-a685-4002-baac-993fdc7b64cf] succeeded in 3.24300003052s: <AsyncResult: 442f9373-d983-4696-a42a-ba42a8ce7761> 
[2017-02-09 14:27:22,178: INFO/MainProcess] Received task: engineapp.tasks.scan_chunk[36a94ad4-3c9e-4f7d-a040-5c2a617a0d8f] 
[2017-02-09 14:27:23,204: INFO/MainProcess] Task engineapp.tasks.scan_chunk[35b74e01-f9fa-471f-8c20-ecbf99a89201] succeeded in 17.4779999256s: [ 

Я хотел бы создать еще один task, который будет выполняться последовательно scan_user для всех пользователей, но я думаю, что это не возможно, так как это было бы на самом деле параллельно.

ответ

0

ch() просто запускает цепочку, не дожидаясь результата. Если вы хотите подождать, сделайте так:

ch = chain(scan_chunk.si([x.id for x in chunk]) for chunk in chunks)() 
return ch.get() 
Смежные вопросы