Я конвертирую .zip файлы в XML с subprocess.call
.Я также записываю стандартную ошибку для каждого процесса, передавая дескриптор открытого файла аргументу stderr
.
ПРОБЛЕМА: иногда преобразование выдает огромное количество ошибок и процесс блокируется.Монитор активности показывает процесс зависания с 8 ГБ памяти.
def convert(directory):
submissions = get_submissions_to_convert(directory)
for submission in submissions:
outpath = get_outpath(submission)
submission_id = os.path.splitext(os.path.basename(outpath))[0]
logfile_path = 'logs/' + submission_id + '.txt'
try:
with open(logfile_path, 'w+') as logfile:
sp.call(['latexmlc', '--timeout=240', '--dest=' + outpath, submission], stderr=logfile)
except KeyboardInterrupt:
# If I interrupt the conversion, remove the logfile so it can be reattempted
print('You interrupted convert()!')
print('Removing ' + logfile_path)
os.remove(logfile_path)
raise
except Exception as e:
print('Something went wrong in convert(): ' + e)
print('Removing ' + logfile_path)
os.remove(logfile_path)
raise
Если я правильно понимаю документы и другие вопросы / ответы, если я передаю PIPE
в stderr
и буфер переполняется, процесс зависает, ожидая, пока буфер не очистится, чего с тех пор не происходитпоскольку call
возвращается только после завершения процесса.Я не могу найти информацию о том, если передача дескриптора открытого файла вызывает ту же проблему взаимоблокировки.
Как я могу записать большой stderr в файл и предотвратить зависание подпроцесса?