Как остановить подпроцесс python, который сразу запускает юнит-тесты? Завершить и убить не работает - PullRequest
1 голос
/ 21 июля 2010

У меня Tkinter GUI, работающий с двумя потоками, основным протектором для GUI и рабочим потоком.Рабочий поток создает подпроцесс, используя следующий код:

myProcess = subprocess.Popen(['python', '-u', 'runTests.py'],  
                         stdout=subprocess.PIPE, 
                         stderr=subprocess.STDOUT)

Файл runTests.py выполняет некоторые настройки, а затем запускает файл модульного теста, используя следующую команду:

execfile('myUnitTests.py')

В файле myUnitTests.py есть несколько модульных тестов, некоторые из которых занимают более пяти минут.В графическом интерфейсе я нажимаю кнопку, чтобы остановить запуск тестов.Это, в свою очередь, заставляет рабочий поток посылать сигнал для остановки подпроцесса:

myProcess.terminate()

Команда terminate не останавливает процесс сразу, она ожидает завершения текущего модульного теста и затем завершает процесс?Я пытался использовать os.kill, но я получаю те же результаты, что и с terminate().

Есть идеи, как сделать мою программу более отзывчивой, чтобы она сразу убивала подпроцесс?

1 Ответ

2 голосов
/ 22 июля 2010

Документация Python [http://docs.python.org/library/signal.html] гласит:

  • Хотя обработчики сигналов Python вызываются асинхронно для пользователя Python, они могут происходить только между«Атомарные» инструкции интерпретатора Python.Это означает, что сигналы, поступающие во время длинных вычислений, реализованных исключительно на языке C (например, совпадения с регулярными выражениями в больших текстах), могут задерживаться на произвольное время.

Так что, если ваши пять-minute unit test выполняет "длинный расчет, реализованный исключительно на C", и ваш жгут модульного тестирования устанавливает обработчик для SIGTERM, это ваша проблема.Если это так, попробуйте myProcess.kill вместо myProcess.terminate (или, если у вас нет 2.6, myProcess.send_signal(9)).SIGKILL не может быть извлечен из пространства пользователя и должен иметь немедленный эффект.

Предупреждение: любые действия по очистке, которые должны выполняться при выходе из среды модульного тестирования, не будут выполняться.

...