Sobes.tech
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 (одатан шумораи ядроҳои процессор) мебошад.

Касб:

  1. Планировщик (қисми runtime-и Go) goroutine-ҳои навро дар навбатҳои глобалӣ ё маҳаллӣ ҷойгир мекунад.
  2. M, ки бо P алоқаманд аст, goroutine-ро аз навбатии P мегирад ва иҷро мекунад.
  3. Вақте, ки goroutine монеъ мешавад (масалан, дар интизории I/O ё mutex):
    • M аз P-и ҳозира ҷудо мешавад.
    • Планировщик кӯшиш мекунад, ки дигар M ёбад, ки ин P-ро ишғол кунад, ё навро эҷод мекунад.
    • Goroutine монеъшуда дар навбат махсус ҷойгир мешавад.
    • Вақте, ки монеъ бардошта мешавад, goroutine дубора runnable мешавад ва ба навбатии P баргардонида мешавад.
  4. Вақте, ки 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-ҳо
}