有个执行shell脚本的函数,因为执行时间比较长,大概 5 分钟左右,所以我用了 celery 做异步处理,不然页面一直卡着在加载情况。
@celery_app.task
def ssh_key(host,shell,action_info):
#执行脚本的一些操作
views.py文件里面调用这个任务
from task_work import ssh_key
abc = ssh_key.delay(info.public_ip,cmd,action_info)
好了,问题来了。 这个异步任务可以正常丢后台运行,那么我现在要获得这个异步任务的结果要怎么处理?
我试过以下一些方式,但都不行。
按照官方做法,可以通过
abc.result 获得结果
但这个的前提是
abc.state == 'SUCCESS'才行
所以我处理方式
from task_work import ssh_key
abc = ssh_key.delay(info.public_ip,cmd,action_info)
while abc.state != 'SUCCESS':
time.sleep(1)
print abc.result
这么处理结果,把异步的又转为同步的
后来想着把time.sleep()也丢到一个新的异步任务中,处理方式如下
task_work.py文件新增一个任务
@celery_app.task
def result_state(task_id):
print task_id
print AsyncResult(task_id).state
##后面接 time.sleep()等一些操作
views.py文件里面也新增一个调用
abc = ssh_key.delay(info.public_ip,cmd,action_info)
print abc.id
result_state.delay(abc.id)
然而也并不行,报以下错误信息:

如果直接在views.py里面打印 id,state 是有值
abc = ssh_key.delay(info.public_ip,cmd,action_info)
print abc.id
print type(abc.id)
from celery.result import AsyncResult
print AsyncResult(abc.id).ready()
print AsyncResult(abc.id).state

各位大神,这是为何呢