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
Lepaskan: 2024-12-24 16:11:10
asal
918 orang telah melayarinya

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)
}()
Salin selepas log masuk

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")
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan