@startuml scenario2_io_with_tothread title I/O операция С to_thread() - Event Loop свободен ✅ participant "Event Loop\n(Main Thread)" as EL participant "Worker Thread" as WT participant GIL participant "OS Kernel" as OS note over EL #90EE90: Event Loop работает EL -> WT: asyncio.to_thread(requests.get) activate WT note over EL #90EE90 **Event Loop СВОБОДЕН!** Обрабатывает другие задачи end note group Event Loop продолжает работу EL -> EL: await других async задач ✅ EL -> EL: обработка новых запросов ✅ EL -> EL: работа продолжается ✅ end group Worker Thread делает I/O WT -> GIL: Захватывает GIL WT -> OS: socket.recv() note over WT,GIL #90EE90 🔓 **GIL ОСВОБОЖДАЕТСЯ** (внутри C-кода requests) Python интерпретатор ждёт OS end note note over OS Ядро читает данные с сетевого интерфейса end note OS --> WT: Данные получены WT -> GIL: Снова захватывает GIL end WT --> EL: Результат готов deactivate WT EL -> EL: получает результат через await note over EL,WT #90EE90 **Ключевой момент:** Пока Worker Thread ждёт OS, Event Loop продолжает работать! GIL освобождается во время системных вызовов end note @enduml