私はperlワーカーサブプロセスを備えた長時間実行のPythonスクリプトを持っています。データは、stdinおよびstdoutを介して子プロシージャに送受信されます。定期的に、子を再起動する必要があります。
残念ながら、しばらく実行すると、ファイルが不足します(「開いているファイルが多すぎます」)。lsofは、多くの開いているパイプを示しています。
Popenされたプロセスの後にクリーンアップする適切な方法は何ですか?これが私が今していることです:
def start_helper(self):
# spawn perl helper
cwd = os.path.dirname(__file__)
if not cwd:
cwd = '.'
self.subp = subprocess.Popen(['perl', 'theperlthing.pl'], shell=False, cwd=cwd,
stdin=subprocess.PIPE, stdout=subprocess.PIPE,
bufsize=1, env=perl_env)
def restart_helper(self):
# clean up
if self.subp.stdin:
self.subp.stdin.close()
if self.subp.stdout:
self.subp.stdout.close()
if self.subp.stderr:
self.subp.stderr.close()
# kill
try:
self.subp.kill()
except OSError:
# can't kill a dead proc
pass
self.subp.wait() # ?
self.start_helper()