Maison > Article > développement back-end > Pourquoi la routine go se comporte-t-elle ainsi ?
l'éditeur php Xigua répondra à votre question sur "la raison du comportement de routine". La routine (goroutine) dans le langage Go est un mécanisme de concurrence léger qui peut obtenir l'effet d'une exécution simultanée. Cependant, dans certains cas, le comportement des routines go peut avoir des résultats inattendus. Cela est principalement dû au mécanisme de planification des routines go et aux caractéristiques du modèle de mémoire. Avant de comprendre en profondeur le comportement de routine du langage Go, nous devons comprendre ces fonctionnalités et leur impact sur le comportement du programme.
Je lis un livre intitulé "Go in action" et je suis un peu confus au sujet de la partie goroutine du livre, en gros je veux savoir deux choses sur le code suivant :
package main import ( "fmt" "runtime" "sync" "time" ) var counter int = 0 var wg sync.WaitGroup var mtx sync.Mutex func main() { wg.Add(2) runtime.GOMAXPROCS(1) go incCounter("A") go incCounter("B") wg.Wait() fmt.Println(counter) } func incCounter(prefix string) { fmt.Println("Started thread ", prefix) defer wg.Done() mtx.Lock() { fmt.Println("Incrementing counter from ", prefix) counter = counter + 1 fmt.Println("Passing to another thread") runtime.Gosched() for i := 1; i < 100; i++ { time.Sleep(1 * time.Second) fmt.Println("Thread still executing ", prefix) } } mtx.Unlock() }
Le résultat est :
Started thread B Incrementing counter from B Passing to another thread Started thread A Thread still executing B Thread still executing B Thread still executing B Thread still executing B
Comme je l'ai dit, définir gomaxprox sur 1 permettrait à un seul Goroutine de s'exécuter à la fois, mais dans ce cas, cela ne semble pas être le cas, en fait les deux Goroutines fonctionnent en parallèle.
Les Goroutines s'exécutent simultanément. Cela signifie que si des processeurs sont disponibles, le planificateur peut planifier leur exécution en parallèle. Si un seul processeur est disponible, ils fonctionneront toujours simultanément, mais un seul goroutine sera exécuté à un moment donné.
Le runtime Go ne garantit pas quelle goroutine s'exécutera en premier. L'ordre de passage d'un ensemble de goroutines nouvellement créées est donc aléatoire,
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!