解決大量呼叫Python subprocess.Popen產生的一些bug
阿新 • • 發佈:2019-01-02
自從工作了就好久沒發部落格,還是出來冒個泡=。=
前段時間寫的一個專案需要用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