【问题标题】:Python Celery: Updating the state of an AsyncResultPython Celery:更新 AsyncResult 的状态
【发布时间】:2015-09-12 10:42:22
【问题描述】:

父任务成功后,根据他的一些子任务结果,我希望更新任务状态。

但是: 1/ 我找不到基于它的 id 来检索实际任务实例的方法,只有它的 AsyncResult

def level5_success(task_id):
  result = app.AsyncResult(task_id)
  # Set the parent task state (do not work)
  app.AsyncResult(task_id).update_state(state='HOWAREYOUDOING') 

2/ 我找不到更新 AsyncResult 状态的方法,只能使用 update_state 来更新任务本身:

def on_level4_success(sender, *args, **kwargs):
  sender.update_state(state='HOWAREYOUDOING')

有什么想法吗?

【问题讨论】:

    标签: python celery celery-task


    【解决方案1】:

    感觉就像您在 celery 的设计范围之外进行操作。工作状态和过程的协调应该通过worker canvas 来完成,而不是通过乱搞芹菜内部。即使你设法让它工作,我怀疑状态黑客是否在 celery 打算与其 API 保持一致的合同中;未来对 celery 的更改完全有可能破坏您的工作。

    你想做什么你不能用组、和弦和链来做?

    【讨论】:

    • 嗯,也许这是一个设计问题。我有不同级别的异步启动任务。最低级别对 twitter api 执行一次 api 调用。成功后,取决于剩余的可用调用(由于 twitter API 限制),我要么立即发送另一个子任务,要么等待 15 分钟(提高 API 限制的时间),或者提取所有内容以完成作业。但是 on_success 信号的使用使我无法使用链。那是我的问题。
    • 听起来像countdown 这样的动态重新调度可以解决您的用例。特别是,您点击 twitter api 并有一个 if 案例,它可以立即重新安排任务,重新安排倒计时,或者执行您需要的任何清除操作。如果你需要在任务之间共享数据,你可以传递一个配置对象。
    猜你喜欢
    • 2014-09-20
    • 2019-03-18
    • 2019-07-18
    • 2021-06-05
    • 2014-06-13
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多