推荐学习书目
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 · Jun 10, 2015 · 4792 views
    This topic created in 4000 days ago, the information mentioned may be changed or developed.
    目前的结构是 web端点击部署,会调用deploy 类,

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

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

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

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

    按@billlee 说的,用ajax。
    aec4d
        9
    aec4d  
       Jun 10, 2015
    http://blog.miguelgrinberg.com/post/using-celery-with-flask 看这个你就明白了 用celery做任务队列 保存结果 然后ajax轮询请求结果
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   970 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 19:25 · PVG 03:25 · LAX 12:25 · JFK 15:25
    ♥ Do have faith in what you're doing.