Как остановить подпроцесс Python, который выполняет модульные тесты сразу же? Завершите и уничтожьте не работу

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

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

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

execfile('myUnitTests.py')

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

myProcess.terminate()

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

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

1
задан Delgan 20 April 2016 в 12:31
поделиться

1 ответ

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

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

Итак, если ваш пятиминутный модульный тест выполняет «длинные вычисления, реализованные исключительно на C», и , ваш модуль модульного тестирования устанавливает обработчик для SIGTERM , это ваша проблема. В таком случае попробуйте myProcess.kill вместо myProcess.terminate (или, если у вас нет 2.6, myProcess.send_signal (9) ). SIGKILL недоступен из пользовательского пространства и должен вступить в силу немедленно.

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

2
ответ дан 2 September 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: