Имам дълго работещ python скрипт с perl worker подпроцес. Данните се изпращат във и извън дъщерната процедура чрез нейните stdin и stdout. Периодично детето трябва да се рестартира.
За съжаление, след известно време на работа, файловете му свършват („твърде много отворени файлове“). lsof показва много оставащи отворени тръби.
Какъв е правилният начин за почистване след процес на Popen'd? Ето какво правя в момента:
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()
Popen.kill
(илиPopen.terminate
) е най-добрият ви залог. - person Santa   schedule 17.02.2011subprocess
, но може да хвърли малко светлина върху_cleanup()
bugs.python.org/issue1731717 - person jfs   schedule 17.02.2011close_fds=True
(по подразбиране на py3k), ако не сте на Windows - person jfs   schedule 17.02.2011lsof | grep " \($(lsof -p YOUR_PYTHON_PID | grep pipe | awk '{if (FNR > 1) {printf "%s", "\\|"} printf "%s", $8}')\) "
Ако другите краища са вашите perl процеси, тогава имате изтичане по някакъв начин... - person rlibby   schedule 20.02.2011