使用类方法作为芹菜任务

2024-04-24 01:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用类的方法作为django芹菜任务,使用@task decorator标记它。阿南德·杰亚哈尔也提出了同样的问题。 是这样的

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 decorator将标记为任务会使类本身成为一个任务,并且可以使用一些参数作为方法选择的键,从run()方法执行方法,但这并不是我想要的。
  • 创建类的实例并将其作为self参数传递给方法会改变我执行方法的方式,而不是像芹菜那样,而是像通常的方法一样(即在测试时)
  • 我试着从构造器中找出如何用语言注册任务,但是芹菜在工人之间共享代码,所以这看起来是不可能的。

谢谢你的帮助!


Tags: django实例方法标记selftask参数foo
3条回答

当你有:

    a = A()

你可以:

    A.foo.delay(a, param0, .., paramN)

干杯

杰里米·萨特菲尔德(Jeremy Satterfield)有一个干净而直接的教程,如果你想完成的话,可以编写基于类的任务。你可以检查一下。

魔术基本上是扩展celery.Task类,包括一个run()方法,如下所示:

from celery import Task

class CustomTask(Task):
    ignore_result = True

    def __init__(self, arg):
        self.arg = arg

    def run(self):
        do_something_with_arg(self.arg)

然后像这样运行任务:

your_arg = 3

custom_task = CustomTask()
custom_task.delay(your_arg)

我不确定是否需要ignore_result = True部分

芹菜从3.0版开始就有了使用方法作为任务的实验支持。

这方面的文档在celery.contrib.methods中,还提到了一些您应该注意的注意事项:

http://docs.celeryproject.org/en/latest/reference/celery.contrib.methods.html

注意:支持从4.0开始从芹菜中删除contrib.methods

相关问题 更多 >