有个执行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
各位大神,这是为何呢
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.