У меня есть приложение JavaScript, работающее на основе Python/PyQt/QtWebKit, которое создает объекты subprocess.Popen
для запуска внешних процессов.Как очистить подпроцесс.Появление экземпляров после завершения процесса
Popen
объекты хранятся в словаре, и ссылается внутренний идентификатор, так что приложение JS может вызывать методы Popen
«с помощью pyqtSlot
, таких как poll()
, чтобы определить, является ли процесс все еще работает или kill()
, чтобы убить изгоев процесса.
Если процесс больше не работает, я хотел бы удалить его объект Popen
из словаря для сбора мусора.
Каким будет рекомендованный подход к автоматической очистке словаря, чтобы предотвратить утечку памяти?
Мои идеи до сих пор:
- вызовов
Popen.wait()
в потоке на порожденного процесса, чтобы выполнить автоматическую очистку прямо по окончании.
PRO: Непосредственная очистка, потоки, вероятно, не требуют большой мощности процессора, поскольку они должны спать, не так ли?
CON: Много потоков в зависимости от нерестовой активности. - Используйте поток, чтобы позвонить
Popen.poll()
обо всех существующих процессах и проверьтеreturncode
, если они в этом случае были завершены и очищены.
PRO: Только один рабочий поток для всех процессов, более низкий уровень использования памяти.
CON: необходим периодический опрос, более высокий уровень использования ЦП, если существует много длительных процессов или много обработанных порожденных.
Какой из них вы бы выбрали и почему? Или любые лучшие решения?
Какая операционная система должна будет работать? – Aya
Главным образом Windows, Mac OS X, если возможно, Linux было бы неплохо иметь. Лучшим было бы решение с платформой-агностиком. – Archimedix
Ну, ответ, который я дал, будет работать на Linux и OSX. Я должен подумать о решении Windows. – Aya