无法从芹菜信号连接到芹菜任务?

时间:2014-10-09 17:21:44

标签: python celery weak-references djcelery

我正在尝试从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装饰器,它将完美运行。但为什么它无法连接到芹菜任务?

1 个答案:

答案 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'