【问题标题】:Override result serializer celery chord覆盖结果序列化器芹菜弦
【发布时间】:2020-09-14 20:03:03
【问题描述】:

我正在使用 Celery 和弦来构建大型文档页面内容的并行 AI 处理。因为这是一个没有公共签名的一次性使用功能,所以我正在挑选对象以分发和重新聚合。处理单个页面的任务是成功读取参数并执行所需的功能。但是,尝试将结果返回到队列以进行后续聚合时失败。

有谁知道为通过 Chord 调用的单个任务指定 result_serializer 的方法?

和弦生成---

callback = processPageResults.subtask(kwargs={'cdd_id' : cdoc.cdd_id,'user_id':user.id},options={'serializer':'pickle'})

res = chord([processPage.s(useBold,
       docPages[i]).set(serializer='pickle') for i in range(0, len(docPages))], callback)()

调用任务--- @shared_task(serializer='pickle',result_serializer='pickle',bind=True, max_retries=20) def processPage(self, *args): useBold = args[0] 页=参数[1] page.processWords(使用粗体) 返回页面

错误---

kombu.exceptions.EncodeError: Object of type DocumentPage is not JSON serializable

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    在重新审视这个之后,我有一个适合我的用例的解决方案。对我来说 result_serializer 是错误的概念。因为 celery 会自动序列化传递给任务的参数,所以我只需将回调的 task_serializer 设置为“pickle”即可解决我的问题。看来,对于一组链式任务,result_serializer 并没有真正的用处

    【讨论】:

      【解决方案2】:

      理想情况下,您可以在签名中设置 result_serializer 以用于正常任务。

      如果是和弦,它对我来说效果不佳。但另一方面,您可以更新 celery 全局配置,它会起作用。

      我正在尝试将其报告为错误。让我们看看。

      celery = Celery("app_name", backend=result_backend, broker=broker_url)
      
      celery.conf.update(
          result_serializer='pickle',        
      )
      

      【讨论】:

      • 查看当前稳定的文档,result_serializer 不是您可以为任务/子任务设置的选项。我相信选项serializer 指的是全局中的task_serializer 选项:docs.celeryproject.org/en/v4.4.7/userguide/… 糟糕的名字选择imo
      • 是的,它似乎不接受。序列化程序是接受任务参数的参数。它不影响返回结果序列化。这似乎是在全局参数中设置结果序列化的唯一方法。
      • 你们中的任何人都知道如何改变这个吗?已经一年了,希望以不同的方式序列化任务一定是一个普遍的问题(并且没有一个序列化器作为所有任务的结果)?
      • 仅供参考,有人打开了一个 github 问题,因为“无法在运行时使用 tasks.add.apply_async(..., results_serializer='pickle') github.com/celery/celery/issues/6310 设置 result_serializer。
      猜你喜欢
      • 2014-06-22
      • 2013-10-02
      • 1970-01-01
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      相关资源
      最近更新 更多