2013-04-30 3 views
1

Я ищу несколько советов относительно наилучшего способа сопоставить список, сгенерированный из задачи, другой задачей в сельдере.Лучший способ сопоставления сгенерированного списка с заданием в сельдерее

Предположим, у меня есть задача под названием parse, которая анализирует документ PDF и выводит список страниц. Каждая страница затем должна быть индивидуально передана в другую задачу под названием feed. Все это должно пойти внутри задачи называется process

Таким образом, один способ, которым я мог бы сделать это следующим образом:

@celery.task 
def process: 
    pages = parse.s(path_to_pdf).get() 

    feed.map(pages) 

Конечно, это не очень хорошая идея, потому что я называю get() внутри задачи.

Кроме того, это неэффективно, так как моя задача parse обернута вокруг функции генератора и способна давать страницы, а это значит, что должно быть возможно поставить первую страницу для загрузки до того, как последняя страница будет получена парсер.

Другая возможность состоит в том, чтобы сделать это:

@celery.task 
def process: 
    for page in parse.s(path_to_pdf).get(): 
     feed.delay(page) 

Этот пример еще включает в себя вызов get() внутри задачи, хотя. Кроме того, этот пример является упрощением, и мне действительно нужно сделать некоторые вещи после того, как все страницы были загружены (то есть в chord).

Я ищу наиболее оптимальный способ сделать это в сельдерее. Буду признателен за любые советы.

Спасибо!

ответ

2

Это, вероятно, слишком поздно, чтобы быть полезным для вас, но вы, вероятно, хотите использовать целевую цепочку:

@celery.task 
def process(): 
    return chain(parse.s(), feed_map.s()) 

@celery.task 
def feed_map(pages): 
    return feed.map(pages) 

если у вас есть последнее задание, скажем final, вы можете сделать это:

@celery.task 
def feed_map(pages): 
    return chord(feed.map.s(page) for page in pages, final.s) 
+0

На самом деле, так я и сделал это и до сих пор пользуюсь этим способом. Никогда не поздно дать хороший ответ, который, надеюсь, поможет другим. Спасибо. – chaimp

+0

Cheers @chaimp, я просто наткнулся на него, ища ответ на другой вопрос, и мне пришлось решить эту проблему совсем недавно;) – theheadofabroom