在 flask 内调用 subprocess 执行 shell 并获取返回值 请问如何异步执行?

2015-06-10 11:20:04 +08:00
 huson
目前的结构是 web端点击部署,会调用deploy 类,

然后deploy 类里面 subprocess用shell模式 执行ansible命令,

然后获取subprocess的得到的shell命令返回值 确定是否部署成功

但是问题是等待ansible 部署需要很长时间,页面就一直在等待,查资料感觉是要用异步,请问怎么实现,在点击部署后不等待,然后待部署好再获取返回值提示部署成功?
4115 次点击
所在节点    Python
9 条回复
ljcarsenal
2015-06-10 11:25:35 +08:00
celery好像可以吧
clino
2015-06-10 11:27:17 +08:00
标准库里的subprocess吗?
如果是这个的话,你不调用wait()的话是不阻塞的吧

"请问怎么实现,在点击部署后不等待,然后待部署好再获取返回值提示部署成功"
最简单的是前端javascript轮询,直到后端返回执行完的结果再在页面上提示
bertram
2015-06-10 11:31:41 +08:00
做一个回调,执行完将结果返回到回调地址。
huson
2015-06-10 11:37:52 +08:00
@ljcarsenal 谢谢,就去看
@clino 是标准库的subprocess,我直接在flask里面的调用的外部class,class就是用subprocess执行shell(ansible命令) 然后返回false or true,然后继续执行页面,代码类似下面

result = deploy(ip).start() #调用外部class 部署
if result ==True:
return render_template('sucessful.html')

然后页面会转很久等待执行完 才会跳转
huson
2015-06-10 11:39:39 +08:00
@bertram 谢谢 我去看下资料
clino
2015-06-10 11:56:28 +08:00
@huson
"lass就是用subprocess执行shell(ansible命令)"
估计里面用了 wait() 或者 communicate() 这种阻塞的函数,你首先要改成不阻塞的方式
billlee
2015-06-10 13:00:50 +08:00
你需要用 ajax.
zeayes
2015-06-10 13:05:21 +08:00
@huson 这个异步也没用,页面始终要等subprocess处理完,才能渲染。

按@billlee 说的,用ajax。
aec4d
2015-06-10 13:05:52 +08:00
http://blog.miguelgrinberg.com/post/using-celery-with-flask 看这个你就明白了 用celery做任务队列 保存结果 然后ajax轮询请求结果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/197437

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX