Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan sync.WaitGroup dengan Fungsi Luaran?

Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan sync.WaitGroup dengan Fungsi Luaran?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-06 05:06:02660semak imbas

How to Avoid Deadlock When Using sync.WaitGroup with an External Function?

Penggunaan penyegerakan yang optimum.WaitGroup dengan Fungsi Luaran

Isu:

Melaksanakan penyegerakan. WaitGroup dengan fungsi luaran menyebabkan kebuntuan apabila cuba mencetak nombor 1 hingga 11. Khususnya, ralat berlaku pada baris wg.Wait().

Penyelesaian 1 (Pendekatan Salah):

Menetapkan wg.Add(1) dan bukannya 2 ialah penyelesaian yang salah, kerana ia tidak menangani isu asas.

Penyelesaian 2 (Pendekatan Diperbaik):

Ubah suai kod seperti berikut:

  • Dalam fungsi utama, hantar alamat penyegerakan.WaitGroup ke fungsi Cetak menggunakan &wg.
  • Alih keluar wg parameter daripada tandatangan fungsi Cetak.
<code class="go">package main

import (
    "fmt"
    "sync"
)

func main() {    
    ch := make(chan int)

    var wg sync.WaitGroup
    wg.Add(2)    

    go Print(ch, &wg)

    go func() {  
        for i := 1; i <= 11; i++ {
            ch <- i
        }
        close(ch)
        wg.Done()
    }()          

    wg.Wait() //deadlock here
}                

func Print(ch <-chan int, wg *sync.WaitGroup) {
    for n := range ch { // reads from channel until it's closed
        fmt.Println(n)
    }            
    wg.Done()
}</code>

Penjelasan:

Mengirim alamat wg ke Print memastikan bahawa contoh WaitGroup yang sama sedang dimanipulasi. Mengalih keluar wg daripada tandatangan fungsi Cetak menghapuskan keperluan untuk fungsi mengetahui tentang WaitGroup luaran.

Kesimpulan:

Penyelesaian kedua ialah pendekatan yang lebih mantap yang mengelakkan kebuntuan dan mengekalkan kebebasan fungsi Cetak daripada wg.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Kebuntuan Apabila Menggunakan sync.WaitGroup dengan Fungsi Luaran?. 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