Middle+
Дар бораи намунаи идоракунии рақобат (GMP) дар забони Go гап занед.
sobes.tech AI
Ҷавоб аз AI
GMP — модели плангардии иҷрои goroutine-ҳо дар Go мебошад, ки дар он:
- G (Goroutine): Як сӯроғи сабук, абстраксия аз болои сӯроғҳои системӣ.
- M (Machine): Як сӯроғи системаи оператсионӣ. Мумкин аст кодро як ё чанд goroutine иҷро кунад.
- P (Processor): Як процессори логикӣ, ки контекст барои иҷрои goroutine-ҳоро намояндагӣ мекунад. Ба ҳар P M таъин мешавад, ва P дорои навбатии маҳаллӣ барои goroutine-ҳои runnable мебошад. Сонияи P дар асоси
$GOMAXPROCS(одатан шумораи ядроҳои процессор) мебошад.
Касб:
- Планировщик (қисми runtime-и Go) goroutine-ҳои навро дар навбатҳои глобалӣ ё маҳаллӣ ҷойгир мекунад.
- M, ки бо P алоқаманд аст, goroutine-ро аз навбатии P мегирад ва иҷро мекунад.
- Вақте, ки goroutine монеъ мешавад (масалан, дар интизории I/O ё mutex):
- M аз P-и ҳозира ҷудо мешавад.
- Планировщик кӯшиш мекунад, ки дигар M ёбад, ки ин P-ро ишғол кунад, ё навро эҷод мекунад.
- Goroutine монеъшуда дар навбат махсус ҷойгир мешавад.
- Вақте, ки монеъ бардошта мешавад, goroutine дубора runnable мешавад ва ба навбатии P баргардонида мешавад.
- Вақте, ки goroutine квотаи вақтро тамом мекунад ё ба таври ошкорона назоратро мегузаронад (кам), планировщик метавонад M-ро ба goroutine-и дигар дар ҳамин P иваз кунад.
Фоидаҳо:
- Истифодаи самараноки сӯроғҳои системӣ M.
- Кам кардани хароҷоти ивазкунии контекст дар муқоиса бо сӯроғҳои табиӣ ё системӣ.
- Тенбал кардани бор байни P тавассути механизми "work stealing" (M метавонад goroutine-ро аз навбатии P-и дигар дуздад).
Маслиҳат барои эҷоди goroutine:
// main.go
package main
import (
"fmt"
"time"
)
func worker(id int) {
fmt.Printf("Корманди %d оғоз мешавад\n", id)
time.Sleep(time.Second) // Иллюстрацияи монеъ шудан/борбандӣ
fmt.Printf("Корманди %d анҷом меёбад\n", id)
}
func main() {
for i := 1; i <= 5; i++ {
go worker(i) // Эҷоди goroutine нав
}
time.Sleep(time.Second * 2) // интизорӣ барои анҷоми goroutine-ҳо
}