我正在尝试将类的方法用作django-celery任务,并使用@task装饰器进行标记。与Anand Jeyahar提出的问题here描述的情况相同。
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)
,它仍然会提示需要至少两个参数,这意味着缺少self
指针。
更多信息:
- 我无法将类转换为模块因为存在继承关系。
- 方法强烈依赖于类成员,所以我不能将它们设置为静态。
- 使用@task修饰符将类标记为任务会使类本身成为任务,并且可以从
run()
方法中执行方法,使用某些参数作为方法选择的键,但这不是我想要的。 - 创建一个类的实例并将其作为
self
参数传递给方法会更改我执行方法的方式,而不是作为celery任务,而是作为普通方法(即在测试时)。 - 我尝试了解如何在构造函数中动态注册任务,但是Celery在工作进程之间共享代码,因此这似乎是不可能的。
感谢您的帮助!