我在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
装饰器,这些功能正常工作。它特别是导致问题的两个装饰者的组合。
谢谢!
答案 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'