Как определить причину в Python кода, который не прерывается с помощью CTRL +C
Я использую запросы для извлечения некоторых файлов. Я заметил, что программа, кажется, зависает после некоторого большого количества итераций, которое варьируется от 5K до 20K. я могу сказать, что она висит, потому что папка, в которой хранятся результаты, не изменилась за несколько часов. Я пытался прервать процесс (я использую IDLE), нажав CTRL + C, но безрезультатно. Я хотел бы прервать, а не убивать процесс, потому что перезапуск проще. В конце концов мне пришлось убить этот процесс. Я перезагрузите компьютер, и он снова будет работать нормально, пока у меня не появятся те же симптомы. Я хотел бы выяснить, как диагностировать эту проблему, но поскольку мне приходится убивать все подряд, я понятия не имею, с чего начать.
Есть ли другой способ посмотреть, что происходит, или более решительно прервать процесс?
Я предполагал, что если я могу прервать, не убивая, я могу посмотреть на глобалы и или сделать какую-то другую работу, чтобы выяснить, где висит мой код.
1 ответ:
На случай, если еще не поздно: я только что столкнулся с теми же проблемами и у меня есть несколько советов
Первое: в python большинство ожидающих API не прерываются (т. е. поток.join (), блокировка.приобретать()...). Взгляните на эти страницы для получения дополнительной информации: http://snakesthatbite.blogspot.fr/2010/09/cpython-threading-interrupting.html http://docs.python.org/2/library/thread.html
Тогда, если поток ожидает такого вызова, он не может быть остановлен. Есть еще один дело в том, что если нормальный поток запущен (или завис), основная программа будет оставаться неопределенно долго, пока все потоки не будут остановлены или процесс не будет убит.
Чтобы избежать этого, вы можете сделать поток демоном thread: Thread.daemon=True перед вызовом потока.начать().
Во-вторых, чтобы найти, где висит ваша программа, вы можете запустить ее с отладчиком, но я предпочитаю ведение журнала, потому что журналы всегда есть на случай, если его поздно отлаживать.
Попробуйте войти в журнал до и после каждого ожидание вызова, чтобы узнать, сколько времени ваши нити были повешены. Чтобы иметь высококачественные журналы, использует Python logging, настроенный с обработчиком файлов, обработчиком html или еще лучше с обработчиком системного журнала.