python 使用subprocess.Popen方法创建子进程后子进程不结束

sanqi1999 2013-09-22 09:40:26
首先,运行环境是Linux

有两个脚本a.py和b.py
在a.py中使用如下语句调用b.py
p = subprocess.Popen(['/usr/bin/python', 'b.py'], stdout=subprocess.PIPE)

如果开启了子进程后a.py中没使用p.wait()来等待子进程结束,而是使用命令行:
ps -ef | grep python | grep b.py | grep -v grep | wc -l
来检查进程是否结束

请问,在这种情况下出现了当b.py运行时间过长(半小时以上)时,它不会正常结束掉,导致a.py一直挂起无法结束,是什么原因呢?

...全文
4520 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanqi1999 2013-09-27
  • 打赏
  • 举报
回复
谢谢大家帮忙分析! 问题原因找到了,是因为管道的问题,子进程向stdout写入了大量的打印信息,当子进程运行很长时间后将管道缓存写满,等待父进程接收而父进程没有进行处理,所以双方死锁,都无法正常结束。
maniachhz 2013-09-23
  • 打赏
  • 举报
回复
引用 4 楼 angel_su 的回复:
如果子进程输出很多数据,调用communicate()等待,或者先前定向到一个文件,若不处理时间久了可能缓存塞满了卡住...
+1 楼主需要的是这个.
sanqi1999 2013-09-23
  • 打赏
  • 举报
回复
没引用清楚,重发下
引用 10 楼 maniachhz 的回复:
[quote=引用 4 楼 angel_su 的回复:] 如果子进程输出很多数据,调用communicate()等待,或者先前定向到一个文件,若不处理时间久了可能缓存塞满了卡住...
+1 楼主需要的是这个.[/quote] 我现在也怀疑是这个原因,因为子进程b.py长时间运行后出现了这个错误提示Linux Error: 32: Broken pipe。继续验证下!
sanqi1999 2013-09-23
  • 打赏
  • 举报
回复
引用
引用 4 楼 angel_su 的回复: 如果子进程输出很多数据,调用communicate()等待,或者先前定向到一个文件,若不处理时间久了可能缓存塞满了卡住... +1 楼主需要的是这个.
我现在也怀疑是这个原因,因为子进程b.py长时间运行后出现了这个错误提示Linux Error: 32: Broken pipe。继续验证下!
yueguanghaidao 2013-09-22
  • 打赏
  • 举报
回复
按理说用ps是没问题的,应该是b.py问题
iasky 2013-09-22
  • 打赏
  • 举报
回复
可以看看b.py的内容么,看看是不是子进程的原因。
ImN1 2013-09-22
  • 打赏
  • 举报
回复
这个我觉得可能是 b.py 写得有问题
panghuhu250 2013-09-22
  • 打赏
  • 举报
回复
引用 8 楼 u012201756 的回复:
[quote=引用 7 楼 panghuhu250 的回复:] 看看回帖大多是“如果...”,“应该...”。一共有a,b两个文件,看起来都不复杂,为什么不直接贴出代码?避免大家猜来猜去。
辛苦大家了,但是代码是公司的业务代码,不好上传的,见谅。[/quote] 做一个与公司业务无关的测试代码。把有问题的代码孤立出来的过程,也是在debug。比如如你所说,b.py只是sleep就会出问题,就已经把b简化到和公司业务无关了。a.py中启动b的代码有了,只差循环调用ps的部分了,这也应该是业务无关的。
sanqi1999 2013-09-22
  • 打赏
  • 举报
回复
引用 7 楼 panghuhu250 的回复:
看看回帖大多是“如果...”,“应该...”。一共有a,b两个文件,看起来都不复杂,为什么不直接贴出代码?避免大家猜来猜去。
辛苦大家了,但是代码是公司的业务代码,不好上传的,见谅。
panghuhu250 2013-09-22
  • 打赏
  • 举报
回复
看看回帖大多是“如果...”,“应该...”。一共有a,b两个文件,看起来都不复杂,为什么不直接贴出代码?避免大家猜来猜去。
ImN1 2013-09-22
  • 打赏
  • 举报
回复
如果你用了 stdout=subprocess.PIPE,就用communicate() 释放缓存,wait反而不重要
sanqi1999 2013-09-22
  • 打赏
  • 举报
回复
子进程b.py就是简单的到指定文件夹下读取文件,然后解析,输出结果到新文件中。并且执行时间较短的时候没什么问题。 刚才又试了一下,b.py直接sleep一小时,一小时后通过ps查看进程状态,出现<defunct>不结束,父进程一直在挂起等待。 后来将a.py中使用wait()等待子进程结束,一小时后它们都正常结束掉了。 python中的subprocess.Popen是不是需要明确的通过wait()来等待结束呢
angel_su 2013-09-22
  • 打赏
  • 举报
回复
如果子进程输出很多数据,调用communicate()等待,或者先前定向到一个文件,若不处理时间久了可能缓存塞满了卡住...

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧