解决大量调用Python subprocess.Popen产生的一些bug

来源:互联网 发布:mac向移动硬盘拷贝 编辑:程序博客网 时间:2024/05/21 17:34

转自 :http://blog.csdn.net/pugongying1988/article/details/54616797

自从工作了就好久没发博客,还是出来冒个泡=。= 
前段时间写的一个项目需要用python的subprocess.Popen大量调用某shell命令,运行到一定量级之后就会产生内存溢出,造成大量线程阻塞,然后就会造成([Errno 24] Too many open files)这个异常。 
网上有人说是close_fds=True这个参数在python2.x默认没打开,这个参数可以关闭文件描述符,试了没有作用。 
后来在国外某个人的帖子找到了和我类似的问题,解决办法就是执行后把stdin,stdout,stderr3个流进行清空即可。 
结合网上的资料,写了一个可以自定义超时时间调用subprocess.Popen执行shell命令的函数(自定义超时为了避免某些shell卡死的情况),用这个函数去调用subprocess.Popen就不会产生上面这些问题了。

def timeout_command(command, timeout):start = datetime.datetime.now()process = subprocess.Popen(command, bufsize=10000, stdout=subprocess.PIPE, close_fds=True)while process.poll() is None:time.sleep(0.1)now = datetime.datetime.now()if (now - start).seconds> timeout:try:process.terminate()except Exception,e:return Nonereturn Noneout = process.communicate()[0]if process.stdin:process.stdin.close()if process.stdout:process.stdout.close()if process.stderr:process.stderr.close()try:process.kill()except OSError:passreturn out


阅读全文
0 0
原创粉丝点击