使用类方法作为Celery任务
- 论坛
- 使用类方法作为Celery任务
9 浏览
使用类方法作为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在工作进程之间共享代码,所以这似乎是不可能的。
谢谢你的帮助!