1. 程式人生 > >解決大量呼叫Python subprocess.Popen產生的一些bug

解決大量呼叫Python subprocess.Popen產生的一些bug

自從工作了就好久沒發部落格,還是出來冒個泡=。= 
前段時間寫的一個專案需要用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 None return None out = 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: pass return out