RuntimeError:切勿在任务Celery中调用result.get()

我正在使用celery将任务发送到远程服务器,并试图将结果恢复。使用远程服务器上的update_state方法不断更新任务状态。

我正在使用发送任务

app.send_task('task_name')

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

所以我尝试运行另一个celery任务以获取结果。

@app.task(ignore_result=True)

def catpure_res(task_id):

task_obj = AsyncResult(task_id)

task_obj.get(on_message=on_msg)

但这会导致以下错误。

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

有没有解决此错误的方法。是否需要运行守护进程来获取结果?

回答:

使用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)

注意:如其他答案中所述,它可能导致性能问题甚至死锁,但是如果您的任务写得好并且没有引起意外的错误,则它应该像魅力一样工作。

以上是 RuntimeError:切勿在任务Celery中调用result.get() 的全部内容, 来源链接: utcz.com/qa/427789.html

回到顶部