Расскажи про планирование goroutine.
Планирование goroutine в Go выполняет встроенный планировщик, распределяющий горутины по системным потокам. Он использует гибрид кооперативного и вытесняющего подходов: обычно горутина отдаёт управление при операциях с каналами, блокировках и т.п., но при длительном непрерывном выполнении (порядка десятков миллисекунд) рантайм может её принудительно прервать.
Планирование goroutine в Go выполняется с помощью встроенного планировщика, который управляет выполнением нескольких goroutines на одной или нескольких физических потоках (threads). Планировщик разбивает выполнение кода на мелкие части и распределяет их между горутинами для эффективного использования ресурсов.
В Go используется гибрид кооперативного и вытесняющего планирования: большую часть времени горутины уступают процессор при операциях с каналами, блокировках, системных вызовах и в специальных точках планировщика, но при слишком долгом непрерывном выполнении (обычно >10 мс) рантайм может их принудительно прервать. Такой подход делает переключения дешёвыми и предсказуемыми, при этом позволяя не «зависать» на одной долго работающей горутине.
Например, с помощью ключевого слова go можно запустить новую горутину, но не гарантируется порядок выполнения горутин:
Для явного переключения контекста и передачи управления другим горутинам можно использовать функцию runtime.Gosched(). Также каналы могут быть эффективным способом синхронизации и планирования выполнения горутин
Отметьте свой прогресс