This media is not supported in your browser
VIEW IN TELEGRAM
Планировщик задач в Golang работает по схеме G-P-M:
горутины (G) распределяются по логическим процессорам (P), а те в свою очередь выполняются на системных потоках (M).
Так достигается мультиплексирование миллионов горутин на ограниченное число потоков ОС.
Когда горутина блокируется (syscall, mutex, канал без данных) - её паркуют, а поток освобождают.
Когда появляется работа — планировщик перебрасывает G между очередями P и старается держать все ядра загруженными.
Чтобы код работал эффективно:
- не плодите лишние горутины
- избегайте долгих блокировок
- контролируйте GOMAXPROCS
- проверяйте количество G через runtime
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
for i := 0; i < 5; i++ {
go func(id int) {
for {
fmt.Println("goroutine", id, "работает на потоке")
time.Sleep(200 * time.Millisecond)
}
}(i)
}
for {
fmt.Println("горутин сейчас:", runtime.NumGoroutine())
time.Sleep(time.Second)
}
}
https://www.youtube.com/shorts/XQmGO29JE7w
#junior #golang
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
package main
import "fmt"
func main() {
s := []int{1, 2, 3}
t := s // t и s смотрят на один и тот же массив
u := append(s, 4)
s[0] = 99 // меняем через s
t = append(t, 5)
fmt.Println("s:", s)
fmt.Println("t:", t)
fmt.Println("u:", u)
}
Ответ:
t: [99 2 3 5]
u: [1 2 3 4]
Дополнительные Вопросы : Где именно произойдёт перераспределение массива, какие срезы продолжат делить общую память, а какие уже нет — в этом и фокус задачи
👉Запустить код - https://go.dev/play/p/M_JvkzNmVY9
@golangtests
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥3❤2👎1