当前位置: 首页 > 面试题库 >

使用类方法作为芹菜任务

费朗
2023-03-14
问题内容

我正在尝试将类的方法用作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在工作人员之间共享代码,因此这似乎是不可能的。

谢谢你的帮助!


问题答案:

自3.0版以来,Celery对使用方法作为任务提供了实验性支持。

有关此文件的文档位于中celery.contrib.methods,还提到了一些您应该注意的警告:

https://docs.celeryproject.org/zh/3.1/reference/celery.contrib.methods.html

请注意*自4.0以来 支持contrib.methods从Celery中删除 *



 类似资料:
  • 我是芹菜、Redis和RabbitMQ的新手。 目前,我正在使用RabbitMQ作为消息代理,并且在配置中没有设置任何内容。(使用Django、MySQL) 我想知道是否有可能使用Redis作为后端的结果存储,同时将RabbitMQ用作消息代理。 我知道的只是添加一些设置,

  • 现在,我想将< code>register事件发布到某个特殊的交换,我可以使用celery远程检索和处理它。 实际上,我已经使用了函数来实现这一点,但是它必须传递来指示应该执行哪个任务并消费它。所以它似乎不太适合我的目标。 我想要的就是这样: 向某些发布消息; 远程机器1订阅此或并捕获消息,用于执行任务; 远程机器2-与机器1相同但执行另一个任务-接收(可能需要回复某些) 例如,就像这个工作流一样

  • 当我运行批处理文件以启用芹菜时: 出现以下错误: 回溯(最后一次调用): 文件“C:\Users\Chernov.a\Desktop\Projects\Roscosmos\Python36-32\lib\runpy.py”,第193行,作为主“main”,mod\u spec) 文件“C:\Users\Chernov.a\Desktop\Projects\Roscosmos\Python36-32

  • 我最近开始研究分布式计算以提高计算速度。我选择了芹菜。然而,我对一些术语不太熟悉。所以,我有几个相关的问题。 来自芹菜文档: ... Celery通过消息进行通信,通常使用代理在客户机和工作人员之间进行调解。为了启动任务,客户机将消息添加到队列中,然后代理将该消息传递给工作者。 什么是客户端(这里)?什么是经纪商?为什么消息通过代理传递?为什么 Celery 会使用后端和队列进行进程间通信? 当我

  • 是否可以在Celery中使用不同的消息代理? 例如:我想使用PostgreSQL而不是RabbitMQ。

  • 问题内容: 我只碰了芹菜和Java两天。:( 现在,我有一个Java客户端通过Rabbitmq发送任务的任务。芹菜将是处理任务的工人。 我知道Python-> rabbitmq-> celery很容易。但是我可以通过java-> rabbitmq-> celery来做到这一点吗? 草案的想法是通过JSON序列化Java函数,然后通过Rabbitmq发送,然后通过celery处理。 最好有示例代码并