V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
huson
V2EX  ›  Python

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

  •  
  •   huson · 2015-06-10 11:20:04 +08:00 · 3915 次点击
    这是一个创建于 3233 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前的结构是 web端点击部署,会调用deploy 类,

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

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

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

    "请问怎么实现,在点击部署后不等待,然后待部署好再获取返回值提示部署成功"
    最简单的是前端javascript轮询,直到后端返回执行完的结果再在页面上提示
    bertram
        3
    bertram  
       2015-06-10 11:31:41 +08:00
    做一个回调,执行完将结果返回到回调地址。
    huson
        4
    huson  
    OP
       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
        5
    huson  
    OP
       2015-06-10 11:39:39 +08:00
    @bertram 谢谢 我去看下资料
    clino
        6
    clino  
       2015-06-10 11:56:28 +08:00
    @huson
    "lass就是用subprocess执行shell(ansible命令)"
    估计里面用了 wait() 或者 communicate() 这种阻塞的函数,你首先要改成不阻塞的方式
    billlee
        7
    billlee  
       2015-06-10 13:00:50 +08:00
    你需要用 ajax.
    zeayes
        8
    zeayes  
       2015-06-10 13:05:21 +08:00
    @huson 这个异步也没用,页面始终要等subprocess处理完,才能渲染。

    按@billlee 说的,用ajax。
    aec4d
        9
    aec4d  
       2015-06-10 13:05:52 +08:00
    http://blog.miguelgrinberg.com/post/using-celery-with-flask 看这个你就明白了 用celery做任务队列 保存结果 然后ajax轮询请求结果
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3133 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:38 · PVG 22:38 · LAX 07:38 · JFK 10:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.