【问题标题】:How to call celery task with class based method?如何使用基于类的方法调用 celery 任务?
【发布时间】:2021-06-07 10:03:12
【问题描述】:

我有课:

class Parser:
    def __init__(self):
        self.OM = Omni() # Creates an class object, which makes auth on the web site, for scrapping
    @app.task
    def foo(self, data):
        self.OM.parse(data)

那么如何使用 foo 方法调用任务呢? 因为当我尝试这样做时,我会出错:缺少参数数据。我认为是因为调用方法获取数据作为自参数

prs = Parser()
prs.foo.delay(data)


         

我该如何解决?

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    在 Celery 3.x 中可以从方法创建任务,但在 Celery 4.0 中被删除了,因为它太有问题了。

    我会创建一个小辅助函数:

    class Parser:
        def __init__(self):
            self.OM = Omni() # Creates an class object, which makes auth on the web site, for scrapping
        
        def foo(self, data):
            self.OM.parse(data)
    
    @app.task
    def foo_task(data)
        prs = Parser()
        parser.foo(data)
    
    
    foo_task.delay(data)
    

    【讨论】:

    • 得到下一个错误 -> Parser 类型的对象不可序列化 JSON 在这种情况下我必须使用哪个序列化程序?
    • 对,我忽略了这一点。最简单的方法是在foo_task 中实例化Parser。请查看我的更新答案。
    猜你喜欢
    • 2013-11-23
    • 2012-03-04
    • 1970-01-01
    • 2019-02-20
    • 2017-03-19
    • 2014-07-27
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多