将参数传递给自定义芹菜任务

时间:2019-03-22 17:47:36

标签: python arguments task celery subclass

我只是想知道将参数传递给自定义任务装饰器的正确方法是什么。例如,我发现我可以将芹菜任务划分为以下类别:

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的实例,我们不希望这样做,并且无论如何也无法正常工作。

关于正确执行此操作的任何建议?

1 个答案:

答案 0 :(得分:0)

您可以添加使用类成员而不是实例成员。因此,您将在__init__的{​​{1}}之外定义参数,如下所示。然后,您可以将此类用作celery任务的基类,并将这些新的类成员用作自定义任务的参数。

注意:很遗憾,您无法在MyTask中传递它们,因为您需要在装饰时实例化__init__

MyTask

然后您可以使用:

class MyTask(celery.Task):
    foo = "default"

    def __init__(self):
        # some custom stuff here
        super(MyTask, self).__init__()

    def __call__(self, *args, **kwargs):
        # do some custom stuff here
        print(self.foo)
        res = self.run(*args, **kwargs)
        # do some more stuff here
        return res