我正在尝试将类的方法用作 django-celery 任务,并使用 @task 装饰器对其进行标记。Anand Jeyahar提出了同样的情况。是这样的
class A:
@task
def foo(self, bar):
...
def main():
a = A()
...
# what i need
a.foo.delay(bar) # executes as celery task
a.foo(bar) # executes locally
问题是即使我像这样使用a.foo.delay(bar)
它所说的类实例,也foo
需要至少两个参数,这意味着self
指针丢失。
更多信息:
- 由于继承,我无法将类转换为模块
- 方法强烈依赖于类成员,所以我不能让它们成为静态的
- 使用@task 装饰器将类标记为任务使该类本身成为任务,并且可以从方法执行
run()
方法,使用一些参数作为方法选择的键,但这并不是我想要的。 - 创建一个类的实例并将其作为
self
参数传递给方法会改变我执行方法的方式,而不是像芹菜一样,而是像通常的方法一样(即在测试时) - 我试图找出如何从构造函数中动态地注册任务,但是 celery 在工作人员之间共享代码,所以这就是为什么它似乎是不可能的。
谢谢你的帮助!