Rumah >pembangunan bahagian belakang >Golang >## Bagaimana untuk Mengelakkan Kebuntuan dalam Program Go Serentak?

## Bagaimana untuk Mengelakkan Kebuntuan dalam Program Go Serentak?

Susan Sarandon
Susan Sarandonasal
2024-10-25 09:00:29775semak imbas

## How to Avoid Deadlocks in Concurrent Go Programs?

Menyelesaikan Kebuntuan Goroutine dalam Go Concurrency

Dalam program Go serentak, kebuntuan boleh berlaku apabila goroutine menunggu selama-lamanya untuk melepaskan sumber. Untuk menyelesaikan kebuntuan tersebut, pertimbangkan contoh berikut:

<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>

Kod ini mengakibatkan ralat jalan buntu: "ralat maut: semua gorouti sedang tidur - kebuntuan!" Ini berlaku kerana pengeluar mempunyai jangka hayat yang terhad, akhirnya menghentikan penghantaran, manakala goroutine pengguna tanpa henti menunggu nilai baharu. Untuk mengelakkan kebuntuan ini, dua strategi utama boleh digunakan:

1. Penamatan Saluran:

Memandangkan saluran hanya boleh ditutup sekali, adalah penting bagi pengeluar untuk memberi isyarat penamatan kepada pengguna. Penyelaras boleh memantau penyiapan pengeluar dan menutup saluran dengan sewajarnya.

2. Penyegerakan Terselaras:

Menggunakan penyegerakan primitif seperti penyegerakan.WaitGroup, pengeluar boleh memberitahu penyelaras apabila mereka selesai dan penyelaras boleh menutup saluran setelah semua pengeluar selesai.

Kod Kemas Kini Menggunakan Penyegerakan:

<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>

Kesimpulan:

Dengan melaksanakan sama ada penamatan saluran atau penyegerakan yang diselaraskan, pembangun boleh mengelakkan kebuntuan goroutine dengan berkesan dan memastikan penyelarasan yang betul dalam program Go serentak.

Atas ialah kandungan terperinci ## Bagaimana untuk Mengelakkan Kebuntuan dalam Program Go Serentak?. 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