Преимущество использования ключевого слова with перед вызовом функции open() в том, что функция file.close() вызовется автоматически и освободит занятые ресурсы после того, как отработает код. С первого взгляда кажется, что экономится лишь лишняя строка кода в нашей программе, но это не совсем так, главной особенностью конструкции with является то, что финальный код (в данном случае file.close()) вызывается гарантированно, даже в том случае, если при обработке интерпретатором строк внутри конструкции произойдет ошибка.
Есть еще один способ создать контекстный менеджер - декоратор @contextmanager из модуля contextlib
https://pastebin.com/wgiB3Yy1
Да, действительно, при помощи этого декоратора можно получить аналогично работающий код. Спасибо за дополнение!
Хорошее объяснение, спасибо!
К сожалению, .terminate() не гарантирует завершение процесса.
.terminate() шлет SIGTERM, но SIGTERM - "мягкий" способ завершения, и процесс его может проигнорировать. И в любом случае, SIGTERM берет время на "подумать" и разослать сигналы в родительский и дочерние процессы, если они есть.
По уму бы сделать проверку на фактическое завершение по SIGTERM и в крайнем случае, если процесс не закрылся, убить жёстко через .kill()
И только после этого вычислять время жизни процесса.
Рады помочь!