首页 > 解决方案 > 向可以从自定义基类访问的 celery 函数添加额外的属性

问题描述

使用@task装饰器定义 celery 任务函数时,是否可以向装饰器添加一些额外的属性,当任务启动时我可以从任务基类访问这些属性,而无需向任务函数本身添加新参数?

就像是

class CustomBase(celery.Task):
     def __call__(self, *args, **kwargs):
         # do something with foo
         ...

         self.run()

@task(base=CustomBase, bind=True, foo=123)
def add(self, x, y):
    return x + y

标签: pythoncelery

解决方案


如果您将一些变量传递给任务装饰器(使用 bind=True),它会将它们传递给任务的构造函数。你可以使用 self 访问它们。只是一个代码示例

from celery import Celery, chord, chain, Task

backend = 'redis://redis:6379/'
app = Celery(result_backend=backend, backend=backend)


class CustomBase(Task):
    def __call__(self, *args, **kwargs):
        print(self.foo)  # in class
        return super().__call__(*args, **kwargs)


@app.task(base=CustomBase, bind=True, foo=123)
def add(self, x, y):
    print(self.foo)  # in task
    return x + y


add.apply_async((1, 2))

推荐阅读