zoukankan      html  css  js  c++  java
  • 关于python sunprocess调用wait后,一直阻塞的问题

    今天在用subprocess去执行问一个python脚本的时候,由于python脚本输出的内容很多,而subprocess的pipe的大小是有限制的,如果pipe的内容过多,将阻塞等待被读取,此时如果我使用wait()等待的话,将一直导致父进程阻塞,

    p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    p.wait()

    stdout, stderror = p.communicate()

    Popen.wait()
    等待子进程结束,设置并返回 returncode 属性。
    注意:如果子进程输出了大量数据到stdout或者stderr的管道,并达到了系统 pipe的缓存大小的话,子进程会等待父进程读取管道,而父进程此时正wait着的话,将会产生传说中的死锁,后果是非常严重滴建议使用communicate()来 避免这种情况的发生。
    Popen.communicate(input=None)
    和子进程交互:发送数据到stdin,并从stdout和stderr读数据,直到收到EOF。等待子进程结束。可选的input如有 有的话,要为字符串类型。
    此函数返回一个元组: (stdoutdata, stderrdata) 。
    注意,要给子进程的stdin发送数据,则Popen的时候,stdin要为PIPE;同理,要可以收数据的话,stdout或者stderr也要为 PIPE。
    注意:读到的数据会被缓存在内存里,所以数据量非常大的时候要小心了。
  • 相关阅读:
    图解插入排序
    图解冒泡排序
    break 和continue的两种用法
    循环的使用选择
    jstl标签库使用报错index_jsp.java找不到问题
    [Android 除錯] Conflict with dependency
    jQueryMobile 網頁使用 ASP.NET Web API 服務
    Chart.js 與 ASP.NET MVC 整合應用
    HTML5 新增的 input 事件
    ASP.NET MVC 5 實作 GridView 分頁
  • 原文地址:https://www.cnblogs.com/GODYCA/p/3117087.html
Copyright © 2011-2022 走看看