Maison  >  Article  >  développement back-end  >  Pourquoi la routine go se comporte-t-elle ainsi ?

Pourquoi la routine go se comporte-t-elle ainsi ?

WBOY
WBOYavant
2024-02-08 23:30:10759parcourir

为什么 go 例程会有这样的行为?

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.

Contenu de la question

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
  1. Pourquoi exécute-t-il la goroutine B en premier ? Parce que dans le code, la goroutine A vient en premier, je veux qu'elle s'exécute également en premier.
  2. goroutine B utilise la méthode .Gosched pour laisser la goroutine A commencer à s'exécuter, mais comme le mutex est verrouillé, la goroutine A attendra qu'elle soit déverrouillée. À l'heure actuelle, j'ai configuré GOMAXPROCS pour qu'il n'ait qu'un seul processeur logique. Pourquoi semble-t-il que les deux goroutines fonctionnent en parallèle ? Cela devrait-il vraiment arriver ?

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.

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer