Python自定义装饰器不能与Celery任务一起使用

时间:2017-12-05 21:49:52

标签: python celery decorator python-decorators

我在Python修饰器方面遇到了一些麻烦。我已经设置了这样的场景:

def decorated(func):
    def call_and_update(*args, **kwargs):
        # do some stuff here
        output = func(*args, **kwargs)
        # do more stuff here
        return output
    return call_and_update

@celery.task
@decorated
def testA():
    return "Test A"

@celery.task
@decorated
def testB():
    return "Test B"

出于某种原因,我首先调用的任何函数似乎都被保存为装饰器中的func

例如,如果我启动一个shell并运行:

>>> testA()
Test A
>>> testB()
Test A

或者,如果我重新启动shell并开始第二次测试:

>>> testB()
Test B
>>>> testA()
Test B

我找到了this question with a similar issue,但是很少有答案围绕着为任务方法使用扩展类。

如果我特意想通过装饰器和函数来实现这个目的,那么有没有办法让它工作?

注意没有 @celery.task装饰器,这些功能正常工作。它特别是导致问题的两个装饰者的组合。

谢谢!

1 个答案:

答案 0 :(得分:4)

每个任务都需要有一个唯一的名称celery docs,因为它没有提供,它使用的是包装函数的名称。

@celery.task(name='test-A')
@decorated
def testA():
    return 'test A'

@celery.task(name='test-B')
@decorated
def testB():
    return 'test B'