Я разрабатываю по сути многопоточный модуль в Python, и я хотел бы узнать, где он проводит свое время. cProfile только, кажется, профилирует основной поток. Есть ли способ профилирования всех потоков, участвующих в расчете?
Как я могу профилировать многопоточную программу в Python?
Ответ 1
См. yappi (еще один профайлер Python).
Ответ 2
Вместо того, чтобы запускать один cProfile
, вы можете запустить отдельный экземпляр cProfile
в каждом потоке, а затем объединить статистику. Stats.add()
делает это автоматически.
Ответ 3
Если вы справитесь с дополнительной работой, вы можете написать свой собственный класс профилирования, который реализует profile(self, frame, event, arg)
. Он вызывается всякий раз, когда вызывается функция, и вы можете довольно легко настроить структуру для сбора статистики.
Затем вы можете использовать threading.setprofile
для регистрации этой функции в каждом потоке. Когда функция вызывается, вы можете использовать threading.currentThread()
, чтобы увидеть, на чём она работает. Более подробную информацию (и готовый к использованию рецепт) можно найти здесь:
http://code.activestate.com/recipes/465831/
http://docs.python.org/library/threading.html#threading.setprofile
Ответ 4
Учитывая, что основные функции ваших разных потоков отличаются, вы можете использовать очень полезный декоратор profile_func()
от здесь.
Ответ 5
Я не знаю никакого профилирующего приложения, которое поддерживает такую вещь для python, но вы могли бы написать Trace-класс, который записывает лог файлы, где вы помещаете информацию о том, когда началась операция и когда она закончилась, и как много времени, которое оно потребляло.
Это простое и быстрое решение вашей проблемы.