54 lines
1.6 KiB
Text
54 lines
1.6 KiB
Text
@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
|