Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Menyelesaikan kebuntuan 'Semua goroutine sedang Tidur' dalam Go?

Bagaimana untuk Menyelesaikan kebuntuan 'Semua goroutine sedang Tidur' dalam Go?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-24 16:11:10919semak imbas

How to Solve the

Menangani Kebuntuan dalam Goroutines: "Semua goroutine sedang Tidur"

Memahami Kebuntuan

Dalam kod yang disediakan, anda menghadapi kebuntuan akibat kepada kekurangan pengendalian saluran yang betul. Masalah timbul dalam fungsi UnloadTrucks, di mana anda menyekat selama-lamanya menunggu trak tiba di saluran ch. Walau bagaimanapun, goroutine utama tidak pernah menutup saluran ini, mengakibatkan penantian yang tidak berkesudahan.

Mengatasi Kebuntuan

Untuk menyelesaikan kebuntuan, anda mesti menutup saluran ch setelah semua trak telah dimuatkan dan dihantar melalui saluran. Ini boleh dicapai menggunakan WaitGroup untuk menjejaki gorouti yang sedang memuatkan trak:

go func() {
    wg.Wait()
    close(ch)
}()

Apabila semua gorouti telah menyelesaikan memuatkan trak, saluran ch akan ditutup, membenarkan UnloadTrucks untuk meneruskan.

Kod Ditulis Semula:

package main

import (
    "fmt"
    "sync"
    "time"
)

type Item struct {
    name string
}

type Truck struct {
    Cargo []Item
    name  string
}

func UnloadTrucks(c chan Truck) {

    for t := range c {
        fmt.Printf("%s has %d items in cargo: %s\n", t.name, len(t.Cargo), t.Cargo[0].name)
    }

}

func main() {
    trucks := make([]Truck, 2)

    ch := make(chan Truck)

    var wg sync.WaitGroup

    for i, _ := range trucks {

        trucks[i].name = fmt.Sprintf("Truck %d", i+1)

        fmt.Printf("Building %s\n", trucks[i].name)
    }

    for t := range trucks {
        wg.Add(1)
        go func(tr Truck) {

            itm := Item{}
            itm.name = "Groceries"

            fmt.Printf("Loading %s\n", tr.name)
            tr.Cargo = append(tr.Cargo, itm)
            ch <- tr
            wg.Done()

        }(trucks[t])
    }

    time.Sleep(50 * time.Millisecond)
    fmt.Println("Unloading Trucks")
    UnloadTrucks(ch)

    fmt.Println("Done")
}

Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan kebuntuan 'Semua goroutine sedang Tidur' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn