Убедитесь, что подпроцессы не работают при выходе из программы Python - PullRequest
54 голосов
/ 26 ноября 2008

Есть ли способ убедиться, что все созданные подпроцесс не работают во время выхода из программы на Python? Под подпроцессом я подразумеваю те, что созданы с помощью subprocess.Popen ().

Если нет, должен ли я повторить все убийства, связанные с выдачей, а затем убить -9? что-нибудь чище?

Ответы [ 14 ]

2 голосов
/ 26 ноября 2008

Есть ли способ убедиться, что все созданные подпроцессы не работают во время выхода из программы Python? Под подпроцессом я подразумеваю те, что созданы с помощью subprocess.Popen ().

Вы можете нарушить инкапсуляцию и проверить , что все процессы Popen завершены, выполнив

subprocess._cleanup()
print subprocess._active == []

Если нет, должен ли я выполнить итерации по всем убивающим действиям, а затем убить -9? что-нибудь чище?

Вы не можете гарантировать, что все подпроцессы мертвы, не выходя и не убивая каждого выжившего. Но если у вас есть эта проблема, вероятно, это из-за более глубокой проблемы проектирования.

0 голосов
/ 12 октября 2018

Вы можете попробовать subalive, пакет, который я написал для аналогичной проблемы. Он использует периодический живой пинг через RPC, и подчиненный процесс автоматически завершается, когда мастер по какой-то причине останавливает живой пинг.

https://github.com/waszil/subalive

Пример для мастера:

from subalive import SubAliveMaster

# start subprocess with alive keeping
SubAliveMaster(<path to your slave script>)

# do your stuff
# ...

Пример для подчиненного подпроцесса:

from subalive import SubAliveSlave

# start alive checking
SubAliveSlave()

# do your stuff
# ...
0 голосов
/ 06 марта 2012
0 голосов
/ 26 ноября 2008

Вот что я сделал для своего приложения posix:

Когда ваше приложение существует, вызовите метод kill () этого класса: http://www.pixelbeat.org/libs/subProcess.py

Пример использования здесь: http://code.google.com/p/fslint/source/browse/trunk/fslint-gui#608

...