← Назад ко всем вопросам

Как можно явно сообщить планировщику, что нужно переключиться на другую горутину

1️⃣ Как кратко ответить

В Go можно явно сообщить планировщику о необходимости переключиться на другую горутину, вызвав функцию runtime.Gosched(). Эта функция приостанавливает выполнение текущей горутины и позволяет планировщику переключиться на выполнение другой горутины.

2️⃣ Подробное объяснение темы

В языке программирования Go горутины — это легковесные потоки, которые позволяют выполнять несколько задач параллельно. Планировщик Go управляет выполнением этих горутин, решая, какая из них должна выполняться в данный момент времени. Иногда может возникнуть необходимость явно указать планировщику, что текущая горутина готова уступить свое время другой горутине. Для этого используется функция runtime.Gosched().

Зачем это нужно?

В многозадачных системах важно эффективно использовать ресурсы процессора. Иногда одна горутина может выполнять длительную задачу, и если она не уступит управление, другие горутины могут оставаться в ожидании, даже если они готовы к выполнению. runtime.Gosched() позволяет улучшить распределение времени выполнения между горутинами, особенно в ситуациях, когда одна горутина может блокировать выполнение других.

Как это работает?

Функция runtime.Gosched() находится в пакете runtime. Когда она вызывается, текущая горутина приостанавливается, и управление передается планировщику, который может выбрать другую горутину для выполнения. Это не завершает текущую горутину, а просто временно приостанавливает её выполнение.

Пример использования

Рассмотрим простой пример, где runtime.Gosched() используется для переключения между двумя горутинами:

package main
​
import (
	"fmt"
	"runtime"
	"time"
)
​
func main() {
	go func() {
		for i := 0; i < 5; i++ {
			fmt.Println("Goroutine 1 - Iteration:", i)
			// Явно сообщаем планировщику переключиться на другую горутину
			runtime.Gosched()
		}
	}()
​
	go func() {
		for i := 0; i < 5; i++ {
			fmt.Println("Goroutine 2 - Iteration:", i)
			// Явно сообщаем планировщику переключиться на другую горутину
			runtime.Gosched()
		}
	}()
​
	// Даем время горутинам завершить выполнение
	time.Sleep(1 * time.Second)
}

Объяснение кода:

  • Импортируемые пакеты:

    • fmt для вывода текста в консоль.
    • runtime для доступа к функции Gosched.
    • time для использования функции Sleep, чтобы дать время горутинам завершить выполнение.
  • Функция main:

    • Создаются две анонимные функции, которые запускаются как горутины с помощью ключевого слова go.
    • В каждой горутине выполняется цикл от 0 до 4, где на каждой итерации выводится сообщение с номером итерации.
    • После каждого вывода вызывается runtime.Gosched(), чтобы явно уступить управление другой горутине.
    • В конце main вызывается time.Sleep(1 * time.Second), чтобы основная горутина не завершилась раньше времени, давая возможность другим горутинам завершить свои циклы.

Этот пример демонстрирует, как runtime.Gosched() может использоваться для более равномерного распределения времени выполнения между горутинами.

Тема: Конкурентность
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки