2

我正在尝试task2task_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.tasktask2 的装饰器,它会完美运行。但是为什么无法连接到 celery 任务呢?

4

1 回答 1

5

技术细节是,该任务最初将由 celery worker 进行惰性评估。也就是创建一个PromiseProxy的对象,不是celery.app.task:Task为了性能

默认情况下,signal.connect()将尝试使用对接收者对象的弱引用 [这里,它是 [ PromiseProxy ]。这就是为什么你得到这样的错误。

解决方法很简单,把connect()的weak参数改成False

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

但我发现它只适用于windows。

下面的应该没问题。在将多个装饰器与任务装饰器结合使用时,确保最后应用任务装饰器

@app.task
@signals.task_success.connect(sender=task1)
def task2():
    return 't2'
于 2014-10-10T09:10:52.687 回答