Приоткройте завесу непонимания принципа выполнения ассинхронного кода.
Есть два уровня контроля работы потоков при работе с python
1. GIL
Когда поток начинает работу, он выполняет захват GIL. Спустя какое-то время планировщик процессов решает, что текущий поток поработал достаточно, и передает управление следующему потоку. Поток №2 видит, что GIL захвачен, так что он не продолжает работу, а погружает себя в сон, уступая процессор потоку №1.
GIL может быть удержан потоком не дольше 5 мс
2. Обеспечением многозадачности занимается планировщик — часть ядра ОС, которая по очереди загружает потоки исполнения в центральный процессор.
На одном ядре процессора в единицу времени выполняется один поток. Он работает до тех пор, пока не израсходует свой квант времени (по умолчанию равен 100 мс) или сам не уступит управление следующему потоку, совершив системный вызов.
Что изменяет в этом поведении библиотека asyncio, блокирует gil, изменяет его поведение, влияет на планировщик задач или что то еще?
Asyncio вообще не имеет никакого отношения к потокам, GIL и планировщику операционной системы. Асинхронность обеспечивается кооперативной многозадачностью. Грубо говоря asyncio просто запускает сопрограммы в цикле, они выполняются до операции ввода/вывода, после чего возвращают управление вызывающему коду, который запускает следующую сопрограмму.
Т.е все происходит в рамках одного потока? Те задачи которые формально можно распределить по потокам передаются в цикл и переодичность переключения их контекста регулируется программистом/библиотекой?