профилирующий предохранитель-питон - PullRequest
3 голосов
/ 18 февраля 2011

Я сейчас пишу плавкий предохранитель, используя fuse-python. Он уже делает то, что должен. Однако после нескольких недель работы он становится заметно медленным. Поэтому я хотел профилировать это. Я знаю о нескольких моментах, где это можно оптимизировать. Но они не должны быть виновниками.

Однако fuse-python зависает в бесконечном цикле (см. строки 733 и 757 источника предохранителей ). Если я запускаю fuse в режиме отладки (используя переключатель -d), он будет работать на переднем плане. Однако я не могу остановить это ни SIGINT, ни CTRL+C (что в любом случае одинаково).

Я пытался использовать модуль signal для перехвата сигнала в главном потоке. Но это тоже не работает. Интересно, что как только я сбил процесс с SIGKILL, я увидел KeyboardInterrupt на stdout. Кроме того, после SIGKILL обработчик сигнала выполняется как ожидалось.

Это имеет последствия для профилирования. Поскольку процесс никогда не завершается нормально, cProfile никогда не получает возможность сохранить файл статистики.

Есть идеи?

1 Ответ

8 голосов
/ 18 февраля 2011

Python устанавливает обработчик, который вызывает KeyboardInterrupt на SIGINT. Если при вызове основного предохранителя обнаружен обработчик сигнала не по умолчанию, он не заменит обработчик своим собственным , который обычно вызывает fuse_session_exit и очищает . После того, как вы вызвали главный предохранитель, KeyboardInterrupt проглатывается оболочками CFUNCTYPE, и вы их никогда не видите.

Ваши варианты:

  • Отправьте SIGQUIT, нажав Ctrl + \ или любой другой завершающий сигнал, кроме SIGINT. Однако предохранитель не выйдет чисто.
  • Установите обработчик сигнала по умолчанию на SIGINT перед вызовом основного предохранителя и восстановите оригинал, когда закончите.

old_handler =signal(SIGINT, SIG_DFL)
# call main
signal(SIGINT, old_handler)

Я бы настоятельно рекомендовал вам переключиться на альтернативную привязку, ведь fuse-python ужасно запутан и с ним трудно работать. Мне очень повезло с fusepy , и я отправил туда несколько патчей.

Когда вы можете завершить работу своего экземпляра FUSE без использования необработанных сигналов, профилировщик Python сможет сохранять статистику в обычном режиме.

...