使用类方法作为Celery任务

9 浏览
0 Comments

使用类方法作为Celery任务

我试图将类的方法作为django-celery任务使用,并使用@task装饰器进行标记。一个类似的情况在这里被描述,问题是由Anand Jeyahar提出的。

具体情况如下所示:

class A:
    @task
    def foo(self, bar):
        ...
        
def main():
    a = A()
    ...
    # 我需要的是
    a.foo.delay(bar) # 作为celery任务执行
    a.foo(bar) # 本地执行

问题是,即使我像这样使用类实例`a.foo.delay(bar)`,它也会说`foo`至少需要两个参数,这意味着`self`指针缺失。

更多信息:

- 我不能将类转换为模块,因为涉及到继承

- 方法强烈依赖于类成员,所以我不能将它们设置为静态方法

- 使用@task装饰器将类标记为任务会使类本身成为任务,可以在`run()`方法中使用某个参数作为方法选择的键来执行方法,但这不完全是我想要的。

- 创建类的实例并将其作为`self`参数传递给方法会改变执行方法的方式,不再是作为celery任务,而是作为普通方法(例如在测试时)

- 我尝试找出如何以动态方式注册任务,例如从构造函数中,但celery在工作进程之间共享代码,所以这似乎是不可能的。

谢谢你的帮助!

0