Подтвердить что ты не робот

Как я могу профилировать многопоточную программу в Python?

Я разрабатываю по сути многопоточный модуль в Python, и я хотел бы узнать, где он проводит свое время. cProfile только, кажется, профилирует основной поток. Есть ли способ профилирования всех потоков, участвующих в расчете?

4b9b3361

Ответ 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-класс, который записывает лог файлы, где вы помещаете информацию о том, когда началась операция и когда она закончилась, и как много времени, которое оно потребляло.

Это простое и быстрое решение вашей проблемы.