RuntimeError:永远不要在任务Celery中调用result.get()

Arp*_*nki 7 python django redis celery

我正在使用芹菜将任务发送到远程服务器并尝试将结果返回.使用远程服务器上的update_state方法不断更新任务状态.

我正在使用发送任务

app.send_task('task_name')
Run Code Online (Sandbox Code Playgroud)

得到celery任务的结果是一个阻塞调用,我不希望我的django应用程序等待结果和超时.

所以我尝试运行另一个芹菜任务来获得结果.

@app.task(ignore_result=True)
def catpure_res(task_id):
    task_obj = AsyncResult(task_id)
    task_obj.get(on_message=on_msg)
Run Code Online (Sandbox Code Playgroud)

但它导致下面的错误.

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
Run Code Online (Sandbox Code Playgroud)

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

Gau*_*mar 9

使用allow_join_result.请参阅下面的代码段.

@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)
Run Code Online (Sandbox Code Playgroud)

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

  • “task_obj.get(on_message=on_msg)”中的“on_msg”来自哪里? (5认同)
  • 导入'从celery.result导入allow_join_result' (2认同)