我正在尝试从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
如果删除任务2的app.task
装饰器,它将完美运行。但为什么它无法连接到芹菜任务?
答案 0 :(得分:5)
技术细节是芹菜工人首先要对这项任务进行懒惰评估。也就是说,创建 PromiseProxy 的对象而不是 celery.app.task:任务以获得性能
默认情况下, signal.connect()会尝试使用对接收器对象的弱引用[这里,它是[ PromiseProxy ]。这就是你遇到这样的错误的原因。
解决方案非常简单,只需将连接()的弱参数更改为错误
task_success.connect(task2, sender=task1, weak=False)
但我发现它只适用于Windows。
以下一个应该没问题。在将多个装饰器与任务装饰器结合使用时,确保最后应用任务装饰器
@app.task
@signals.task_success.connect(sender=task1)
def task2():
return 't2'