2014-10-09 2 views
2

Я пытаюсь соединить task2 от task_success сигналаНе удается подключиться к заданию сельдерея из сигнала сельдерея?

from celery.signals import task_success 
from celery import Celery 

app = Celery() 

@app.task 
def task1(): 
    return 't1' 

@app.task 
def task2(): 
    return 't2' 

task_success.connect(task2, sender=task1) 

Когда я запускаю этот код, его метания

TypeError: cannot create weak reference to 'PromiseProxy' object 

Если удалить app.task декоратора для TASK2, она прекрасно работает. Но почему он не может подключиться к заданию сельдерея?

ответ

5

Технические детали заключаются в том, что задача сначала будет оценена работником сельдерея. То есть, чтобы создать объект PromiseProxy вместо celery.app.task: Задача для выполнения

И по умолчанию, signal.connect() будет пытаться использовать слабые ссылки на объекты приемника [ Здесь [PromiseProxy]. Вот почему вы получили такую ​​ошибку.

Решение очень простое, просто изменить параметр слабый подключения() к Ложные

task_success.connect(task2, sender=task1, weak=False) 

Но я обнаружил, что он работает только на окнах.

Следующее должно быть в порядке. Чтобы убедиться, что декоратор задач применяется последним при использовании нескольких декораторов в сочетании с декоратором задачи

@app.task 
@signals.task_success.connect(sender=task1) 
def task2(): 
    return 't2' 
+0

Это предотвращает ошибку, но не вызывает задачу. Любая идея, почему это происходит? – ChillarAnand

+0

Я не уверен, что это из-за «отправителя». Просто удалите его и попробуйте – Jacky

+0

Я уже пробовал, что это не сработало. – ChillarAnand

Смежные вопросы