понимание вывода профилировщика Python asyncio

Я пытаюсь понять вывод профилировщика Python при запуске программы на основе Python asyncio:

Вывод асинхронного профилировщика Python3

Я вижу, что моя программа тратит примерно 67% времени на попытки получить блокировку потока.

  1. Это нормально в программах asyncio? Мое приложение является однопоточным, я не откладываю работу на рабочие потоки и минимально вывожу журнал на консоль.

  2. Мое приложение тратит ~ 21% на выборочный вызов. Означает ли это примерно, что 20% времени выполнения тратится на бездействие (ожидание события или обратного вызова)?


person jpou    schedule 06.09.2016    source источник


Ответы (2)


Похоже, вы используете отладчик, который собирает данные из всех потоков. Ожидание получения условной переменной означает простое ожидание в пуле потоков новых задач.

Время, проведенное в select, снова означает простое ожидание, но в данном случае это ожидание сетевой активности.

person Andrew Svetlov    schedule 06.09.2016

Проблема с профилированием асинхронных приложений заключается в том, что при переключении контекста сопрограмм вы не увидите их в стеке, и вам может быть трудно выяснить, на какую функцию на самом деле тратится время. В вашем случае вы, вероятно, видите собственные функции цикла событий asyncio (конечно, не уверены, не видя вывода).

Я определенно рекомендую yappi. Начиная с версии 1.2.1, он может изначально профилировать сопрограммы и точно сообщать вам, сколько времени стены или процессора тратится внутри сопрограммы.

Подробнее об этом профилировании сопрограмм см. здесь.

person Sumer Cip    schedule 19.12.2019