我想知道如何正确地向自定义任务装饰器传递参数。例如,我发现可以通过以下方式对celery任务进行子类化:
class MyTask(celery.Task):
def __init__(self):
# some custom stuff here
super(MyTask, self).__init__()
def __call__(self, *args, **kwargs):
# do some custom stuff here
res = self.run(*args, **kwargs)
# do some more stuff here
return res
并按以下方式使用:
@MyTask
def add(x, y):
return x + y
但是我希望能够传递一个参数给这个任务,并根据该参数的不同(或等效地,基于它所装饰的函数的不同)而使其行为不同。我可以想到两种方法来实现这一点。其中一种是通过向celery任务包装器传递额外的kwarg并显式指定基础项来实现,如下所示:
@celery.task(base=MyTask, foo="bar")
def add(x, y):
return x + y
我可以在我的自定义任务中通过self.foo
访问它,但这让我感觉有点像作弊。另一种方法是检查self.task
,并根据其值更改行为,但这似乎也有些过度。理想情况下,我希望直接将kwarg传递给自定义任务类,
@MyTask(foo="bar")
def add(x, y):
return x + y
当然,这会创建一个
MyTask
实例,但我们既不想要它,也无法正常工作。有关正确的做法有什么建议吗?