首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RuntimeError:不要在任务芹菜中调用result.get()

RuntimeError:不要在任务芹菜中调用result.get()
EN

Stack Overflow用户
提问于 2017-08-03 17:15:04
回答 2查看 10.5K关注 0票数 15

我正在使用芹菜发送一个任务到远程服务器,并试图得到的结果。在远程服务器上使用状态方法不断更新任务状态。

我正在发送任务

代码语言:javascript
复制
app.send_task('task_name')

获得芹菜任务的结果是一个阻塞调用,我不希望我的django应用程序等待结果和超时。

所以我试着跑另一个芹菜任务来获得结果。

代码语言:javascript
复制
@app.task(ignore_result=True)
def catpure_res(task_id):
    task_obj = AsyncResult(task_id)
    task_obj.get(on_message=on_msg)

但它会导致下面的错误。

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 367, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/app/trace.py", line 622, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/arpit/project/appname/tasks/results.py", line 42, in catpure_res
    task_obj.get(on_message=on_msg)
  File "/usr/local/lib/python2.7/dist-packages/celery/result.py", line 168, in get
    assert_will_not_block()
  File "/usr/local/lib/python2.7/dist-packages/celery/result.py", line 44, in assert_will_not_block
    raise RuntimeError(E_WOULDBLOCK)
RuntimeError: Never call result.get() within a task!
See http://docs.celeryq.org/en/latest/userguide/tasks.html#task-synchronous-subtasks

是否有解决此错误的方法。是否必须运行守护进程才能获得结果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-03 17:53:38

使用结果。看下面的片段。

代码语言:javascript
复制
@app.task(ignore_result=True)
def catpure_res(task_id):
    task_obj = AsyncResult(task_id)
    with allow_join_result():
        task_obj.get(on_message=on_msg)

注意:正如在其他答案中提到的,它可能会导致性能问题甚至死锁,但是如果您的任务写得很好,并且不会导致意外的错误,那么它就像一种魅力一样工作。

票数 22
EN

Stack Overflow用户

发布于 2017-08-03 17:35:22

正如您的标题所解释的,在任务中调用get是一种错误的做法,可能导致死锁。相反,您可以在任务状态准备好时检查任务状态,并检查其结果get

代码语言:javascript
复制
result = catpure_res.AsyncResult(task_id, app=app)
    if result.ready():
        return result.get()

    return result.state

您可以将上面的片段包装在一个函数中,并每隔x秒请求一次。

编辑:关注您的评论:

  • 您可以获得result.state,并将retry机制与countdown一起使用,直到任务result.state == SUCCESS
  • 您可以添加芹菜beat来运行定期任务,检查主任务是否结束。
  • 注意,使用如此繁重的任务(持续时间较长)也是一种糟糕的做法。考虑将其分解为一个小任务,并使用画布将它们组合起来。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45490722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档