2016-04-09 5 views
1

У меня есть рабочая цепочка, но когда я добавляю apply_async(), она выполняет только первую задачу.Почему сельдерей выполняет только первую задачу в цепочке?

@task(name='run_a', delay=True) 
def run_a(**kwargs): 
    do_whatever(kwarg['var']) 
    return 

@task(name='run_b', delay=True) 
def run_b(**kwargs): 
    # ... 
    return 

@task(name='run_c', delay=True) 
def run_c(**kwargs): 
    # ... 
    return 

С командой цепи:

ret = chain(
    run_a.s(**kwargs), 
    run_b.s(**kwargs), 
    run_b.s(**kwargs) 
).apply_async() 
  • Без apply_async все это работает (синхронно), как ожидалось.
  • 'kwargs' - это дикт.
+0

Может кто-нибудь подтвердить, что это связано с использованием в kwargs Сыроватского? http://stackoverflow.com/questions/14968265/celery-task-chain-and-accessing-kwargs – GerardJP

+0

Когда вы попадаете в 'run_b', я получаю typeError в журнале Celery Worker:' TypeError: run_b() принимает ровно 0 аргументов (8 данных) ' – GerardJP

ответ

0

Хотя сельдерей проверяет ваши задачи перед выполнением, для FUNC работать *args и **kwargs ожидаются.

# Kwargs was filled, I added an empty args list 
args = [] 
kwargs = { 
    'some': 'intelligent data', 
    } 

При вызове функции с обоими, он работает, как ожидалось:

ret = chain(
    run_a.s(*args, **kwargs), 
    run_b.s(*args, **kwargs), 
    run_b.s(*args, **kwargs) 
).apply_async()