Для создания monkey-patch для вашего AsyncIO-кода, чтобы улучшить логирование и отладку блокировок в вашем event loop, можно заменить стандартные blocking функции, такие как `time.sleep()`, на асинхронные эквиваленты или обернуть их в такую функцию, которая будет фиксировать стек вызовов (call stack). В вашем случае `time.sleep()` блокирует весь event loop, и это может быть трудно отследить.
Вот пример, как сделать это:
1. **Замените blocking функции.** Вы можете создать свою обертку для `time.sleep()`, которая будет регистрировать стек вызовов перед вызовом блочащей функции.
2. **Используйте Python's `traceback` модуль.** Он поможет вам получить информацию о стеке вызовов.
Вот пример кода, который показывает, как это сделать:
```python
import time
import asyncio
import traceback
import functools
# Сохраним оригинальную функцию
original_sleep = time.sleep
def monkey_patched_sleep(seconds):
stack = traceback.format_stack()
print(f"Blocking call to time.sleep({seconds})\n" + ''.join(stack))
original_sleep(seconds)
# Заменяем time.sleep на наш monkey-patch
time.sleep = monkey_patched_sleep
async def main():
print("Start of main")
await asyncio.sleep(1) # это не блокирует event loop
time.sleep(2) # это будет блокировать event loop
print("End of main")
if __name__ == "__main__":
asyncio.run(main(), debug=True)
```
### Как это работает:
- Мы сохраняем оригинальную функцию `time.sleep`.
- Мы создаем новую функцию `monkey_patched_sleep`, которая вызывает `traceback.format_stack()` для получения информации о стеке вызовов и выводим её в консоль (или обрабатываем по-другому, в зависимости от ваших потребностей).
- Затем мы переназначаем `time.sleep` на нашу новую функцию.
### Ограничения:
- Этот метод будет работать только для `time.sleep`. Если у вас есть другие блокирующие функции, такие как `threading.sleep`, вам нужно будет проделать то же самое с ними.
- Это решение может создавать много вывода, если у вас часто происходят блокирующие вызовы, так что вам, возможно, стоит сделать логирование более избирательным, основанным на уровне или других критериях.
Используйте этот метод с осторожностью и тестируйте его в ваших условиях, так как его использование может значительно увеличить вывод в консоли.