Heim  >  Artikel  >  Backend-Entwicklung  >  ## Wie vermeide ich Deadlocks in gleichzeitigen Go-Programmen?

## Wie vermeide ich Deadlocks in gleichzeitigen Go-Programmen?

Susan Sarandon
Susan SarandonOriginal
2024-10-25 09:00:29677Durchsuche

## How to Avoid Deadlocks in Concurrent Go Programs?

Goroutinen-Deadlock in Go-Parallelität lösen

In gleichzeitigen Go-Programmen können Deadlocks auftreten, wenn Goroutinen auf unbestimmte Zeit darauf warten, dass andere Ressourcen freigeben. Um solche Deadlocks zu beheben, betrachten Sie das folgende Beispiel:

<code class="go">// Create a channel for communication between goroutines.
ch := make(chan int)

// Start producer goroutines that send values to the channel.
go producer(ch, 100*time.Millisecond, 2)
go producer(ch, 200*time.Millisecond, 5)

// Indefinite loop to continuously receive values from the channel.
for {
    fmt.Println(<-ch)
}</code>

Dieser Code führt zu einem Deadlock-Fehler: „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!“ Dies liegt daran, dass die Produzenten eine begrenzte Lebensdauer haben und schließlich die Übertragung stoppen, während die Konsumenten-Goroutine endlos auf neue Werte wartet. Um diesen Stillstand zu vermeiden, können zwei Hauptstrategien angewendet werden:

1. Kanalbeendigung:

Da Kanäle nur einmal geschlossen werden können, ist es für Produzenten wichtig, dem Verbraucher die Beendigung zu signalisieren. Ein Koordinator kann die Fertigstellung der Produzenten überwachen und den Kanal entsprechend schließen.

2. Koordinierte Synchronisierung:

Mithilfe eines Synchronisierungsprimitivs wie sync.WaitGroup können Produzenten den Koordinator benachrichtigen, wenn sie fertig sind, und der Koordinator kann den Kanal schließen, sobald alle Produzenten fertig sind.

Aktualisierter Code mithilfe der Synchronisierung:

<code class="go">import (
    "fmt"
    "sync"
    "time"
)

func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) {
    defer wg.Done()

    for i := 0; i < num; i++ {
        ch <- i
        time.Sleep(d)
    }
}

func main() {
    // Create a WaitGroup for coordinating producer completion.
    wg := &sync.WaitGroup{}

    // Initialize the channel for communication between goroutines.
    ch := make(chan int)

    // Start producer goroutines.
    wg.Add(2)
    go producer(ch, 100*time.Millisecond, 2, wg)
    go producer(ch, 200*time.Millisecond, 5, wg)

    // Assign a goroutine to close the channel when all producers have finished.
    go func() {
        wg.Wait()
        close(ch)
    }()

    // Iterate over values from the channel until it's closed.
    for v := range ch {
        fmt.Println(v)
    }
}</code>

Fazit:

Durch die Implementierung entweder der Kanalbeendigung oder der koordinierten Synchronisierung können Entwickler Deadlocks und Goroutinen effektiv vermeiden Stellen Sie eine ordnungsgemäße Koordination in gleichzeitigen Go-Programmen sicher.

Das obige ist der detaillierte Inhalt von## Wie vermeide ich Deadlocks in gleichzeitigen Go-Programmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn