tgoop.com/go_interview_lib/460
Create:
Last Update:
Last Update:
💬 Как горутина, выполняющая блокирующий системный вызов, перемещается в глобальную очередь готовых к выполнению горутин в рантайме Go. Какие этапы проходят при этом?
Когда горутина выполняет блокирующий системный вызов, она блокируется и рантайм Go временно паркует её, освобождая поток (M) для выполнения других горутин.
После завершения блокирующей операции горутина разблокируется и перемещается в глобальную очередь готовых к выполнению горутин. Планировщик Go затем выбирает горутину из глобальной очереди и назначает её на доступный поток (M) с логическим процессором (P) для продолжения выполнения.
📌 Пример:
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
go fetch("http://example.com")
fmt.Println("Fetching started")
time.Sleep(5 * time.Second)
}
func fetch(url string) {
resp, err := http.Get(url)
if err != nil {
fmt.Println("Error fetching URL:", err)
return
}
defer resp.Body.Close()
fmt.Println("Fetched", url, "with status:", resp.Status)
}
Он демонстрирует, как горутина
fetch
блокируется на HTTP-запросе, освобождает поток, и после завершения системного вызова возвращается в глобальную очередь для продолжения выполнения.BY Библиотека Go для собеса | вопросы с собеседований
Share with your friend now:
tgoop.com/go_interview_lib/460