При работе с многопроцессорным пулом Python обработка событий KeyboardInterrupt не всегда является простой задачей. В этой статье мы рассмотрим, как обрабатывать такие прерывания и обеспечивать корректное завершение процессов.
Приведенный пример кода демонстрирует проблему. Несмотря на наличие блока catch для KeyboardInterrupt, он не выполняется при нажатии Control-C. Вместо этого программа зависает до тех пор, пока не будет завершена извне.
Корень этой проблемы лежит в ошибке Python, связанной с блокировкой по условию в threading.Condition.wait(). В этом контексте KeyboardInterrupt никогда не отправляется. В результате это предотвращает обработку прерывания в пуле.
Одним из решений этой проблемы является указание тайм-аута при ожидании результатов. Вместо карты() можно использовать метод map_async() с параметром таймаута. Этот подход позволяет распознавать и обрабатывать KeyboardInterrupt:
results = pool.map_async(slowly_square, range(40)).get(9999999)
Установив большое значение таймаута , мы, по сути, говорим Пулу продолжать ждать результатов, пока пользователь не прервет его.
Важно отметить, что есть некоторые ограничения для этого обходного пути. Если тайм-аут истечет до завершения всех задач, неполные результаты будут отброшены. Поэтому крайне важно выбрать подходящее значение тайм-аута, которое сбалансирует скорость реагирования с риском получения неполных результатов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3