python Popen卡死问题
2024-10-10 21:32:35
程序经常卡死,定位了半天才定位到原因,原来是Popen导致的卡死;
程序如下:
s = subprocess.Popen([*,*,*], stdout=subprocess.PIPE)
ret = s.stdout.read()
return ret
官方文档的解释是:
This will deadlock when using stdout=PIPE
and/or stderr=PIPE
and the child process generates enough output to a pipe such that it blocks waiting for the OS pipe buffer to accept more data. Use communicate()
to avoid that.
原因是使用Popen.
wait
()后直接读PIPE.stdout.read()之前,可能缓存已经满了,此时导致了卡死。
解决办法:使用communicate()
例如:
s = subprocess.Popen([*,*,*], stdout=subprocess.PIPE)
stdoutdata, stderrdata = s.communicate()
return stdoutdata
此外,最后在调用Popen的时候加上参数close_fds=True,参见官方文档说明:
popen2 closes all file descriptors by default, but you have to specify close_fds=True with Popen
以后使用Popen还是小心点,这里面坑很多。
最新文章
- C/C++ char a[ ] 和 char *a 的差别,改变 char *a爆内存错误的原因
- MVC 全局异常处理及禁用显示头
- Bootstrap学习笔记上(带源码)
- WINAPI 变量(2861个)
- Languages
- MapReduce流程、如何统计任务数目以及Partitioner
- 微信支付 v 3.3.6
- C++ map简单运用
- Codeforces 474A Keyboard (水
- servlet 用法
- [Swift]LeetCode27. 移除元素 | Remove Element
- MongoDB集群的搭建
- 剑指offer PART 2
- MySQL中间件之ProxySQL(3):Admin管理接口
- VCS双机+oracle 11gR2+ASM主机名修改
- 基于 Dojo toolkit 实现 web2.0 的 MVC 模式
- sleep() 和 wait() 有什么区别?
- shell脚本之分析oracle数据库数据泵日志中表的大小
- Linux安装Nginx报错: ./configure: error: C compiler cc is not found
- 乘风破浪:LeetCode真题_026_Remove Duplicates from Sorted Array