Python:关于subprocess.stdout.read()导致程序死锁的问题
subprocess.stdout.read()导致程序死锁的问题解决
今天有位老哥联系我说,在我的python之路系列中,解决粘包问题那一章的代码有BUG

这里当运行命令过于庞大的时候,会导致程序直接卡死在这里,我自己试试了下,确实有这个问题。
但是到底是为什么呢,前前后后想了好久,没找到答案,后来google了半天以及翻了下官方文档
终于找到了问题所在!!!划重点
如果设置了stdout或stderr,subprocess就会调用os.pipe创建一个管道用于其和子进程之间的通信,而上面的问题正好是cmd输出的数据把pipe塞满,无法继续往pipe里写入数据导致程序hang住,而我们没有去读出pipe数据,而是死等子进程完成,导致死锁。
具体大小的话windows只有4kb,而linux有64kb(辣鸡windows)
那么如何解决呢
解决办法一:
使用communicate及时读出pipe中内容,避免堵死,但在输出量非常大的情况下会影响性能:

这也是官方文档里推荐的做法,但是不能乱用,因为会影响性能.
解决办法二:
使用文件代替PIPE,但是这样子的话传给客户端的就只能是文件了。
fdout = open(len(procs)+".out", 'w')
fderr = open(len(procs)+".err", 'w')
总结:
两种方法需要自己根据情况进行取舍,都有各自的优势和劣势。
Python:关于subprocess.stdout.read()导致程序死锁的问题的更多相关文章
- python 利用subprocess调用cmd命令程序,并正确输出控制台的输出中文
平台Python3.7 1.利用控制台运行程序后在控制台会输出中文提示,但是用python调用subprocess.run函数后返回的输出是乱码,于是,解决方法是用subprocess.check_o ...
- python的subprocess基本
先在同一个文件夹下创建两个.py文件. 第一个:13.py # -*- coding: utf-8 -*- __author__ = "YuDian" ''' multiproce ...
- python subprocess 自动运行实验室程序
import threading, os, subprocess, time exec_path = "/home/xhz/gems/ruby/amd...../bin/tester.exe ...
- 使用python的subprocess启动windows程序提示WindowsError: [Error 6] The handle is invalid
代码如下: subp = subprocess.Popen(cwd_path + "test.exe", cwd = cwd_path, shell = True, stdout ...
- python的subprocess:子程序调用(调用执行其他命令);获取子程序脚本当前路径问题
python当前进程可以调用子进程,子进程可以执行其他命令,如shell,python,java,c... 而调用子进程方法有 os模块 参见:http://blog.csdn.net/longshe ...
- Python的subprocess模块(二)
原文:http://blog.chinaunix.net/uid-26000296-id-4461522.html 一.subprocess 模块简介 subprocess最早是在2.4版本中引入的. ...
- python模块subprocess学习
当我们想要调用系统命令,可以使用os,commands还有subprocess模块整理如下: os模块: 1. os.system 输出命令结果到屏幕.返回命令执行状态. >>> o ...
- Python中subprocess学习
subprocess的目的就是启动一个新的进程并且与之通信. subprocess模块中只定义了一个类: Popen.可以使用Popen来创建进程,并与进程进行复杂的交互.它的构造函数如下: subp ...
- Python之subprocess模块的使用
1.subprocess调用系统的命令 #!/usr/bin/env python # -*- coding: utf-8 -*- import subprocess import sys compl ...
随机推荐
- Java使用到的常用类总结
基本类型 常用:int.long.double.boolean. 不常用:byte.float.char.short
- graphics基础
- Linux安装ElasticSearch启动报错的解决方法
Linux安装ElasticSearch后,ElasticSearch是不能用root用户启动的,以root用户启动会报错Refer to the log for complete error det ...
- git常用开发流程
我们在使用git进行项目管理时,远程仓库的分支情况一般是: master分支作为稳定版分支,用于直接发布产品,dev分支则用于日常开发 备注: 也可以只有一个master分支,这里只介绍第一种情况. ...
- gcc error - "iostream: No such file or directory"
#include <iostream> using namespace std; int main(void) { cout<<"Hello World!\n&quo ...
- 深入浅出 - Android系统移植与平台开发(七)- 初识HAL【转】
本文转载自:http://blog.csdn.net/mr_raptor/article/details/8069588 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] ...
- html5手机网站需要加的那些meta标签,手机网站自适应
的html5相关meta和标签 a.<!-- 强制让文档与设备的宽度保持1:1 --> <meta name="viewport" content=& ...
- 7.8 LZW压缩的实现
7-10 lzw.c #include <stdlib.h> #include <stdio.h> #define BITS 12 //每个数据项的二进制位数 #define ...
- 微软面试题:鸡蛋从第N层及以上的楼层落下会摔破
from:https://blog.csdn.net/qq_18425655/article/details/52326709 题目: 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破 ...
- storm源码剖析(1):storm脚本
今天看了一下storm的命令行脚本${STORM_HOME}/bin/storm,现在将剖析过程整理一下,作为记录.注:使用的storm版本为0.8.0. ${STORM_HOME}/bin/stor ...