Skop saluran penimbal dalam Go disekat

WBOY
Lepaskan: 2024-02-09 09:42:30
ke hadapan
658 orang telah melayarinya

Go 中缓冲通道的范围是阻塞的

editor php Yuzai Dalam bahasa Go, saluran penimbal ialah alat yang berkuasa dan fleksibel. Saluran penampan menyediakan mekanisme untuk menyegerakkan antara penghantaran dan penerimaan data, membolehkan kawalan kepantasan dan susunan komunikasi. Skopnya adalah menyekat, yang bermaksud bahawa apabila saluran penuh atau kosong, operasi hantar dan terima akan disekat sehingga ruang atau data yang mencukupi tersedia. Mekanisme ini berkesan boleh mengelakkan persaingan sumber dan masalah kebuntuan dalam program serentak, dan meningkatkan kebolehpercayaan dan prestasi program. Dengan menggunakan saluran penimbal secara rasional, pembangun boleh mengawal proses pelaksanaan program serentak dengan lebih baik dan meningkatkan kecekapan dan kestabilan program.

Kandungan soalan

Mesti ada sesuatu yang tidak kena dengan otak saya, tetapi saya disekat semasa mengulangi saluran penimbal

    results := []search.book{}
    resultsstream := make(chan []search.book, 2)
    defer close(resultsstream)

    // parallelize searches to optimize response time
    for _, src := range sources {
        go src.search(bookname, resultsstream)
    }

    counter := 0
    for sourceresults := range resultsstream {
        counter = counter + 1
        results = append(results, sourceresults...)

        fmt.println(counter)
    }

    fmt.println("never called")
Salin selepas log masuk

Output

1
2
Salin selepas log masuk

Ini membuktikan 2 sumber memenuhi saluran (iaitu kapasiti maksimum). Apa yang saya hilang di sini? never called adalah, baik, tidak pernah dipanggil.

Sunting

    var wg sync.WaitGroup
    results := []search.Book{}
    resultsStream := make(chan []search.Book, len(sources))
    defer close(resultsStream)

    // parallelize searches to optimize response time
    for _, src := range sources {
        wg.Add(1)
        go src.Search(bookName, resultsStream, &wg)
    }

    wg.Wait()
    close(resultsStream)
    for sourceResults := range resultsStream {
        results = append(results, sourceResults...)
    }

    c.JSON(http.StatusOK, gin.H{
        "results": results,
    })
Salin selepas log masuk

Penyelesaian

Gelung for sourceResults := range resultsStream Terima nilai berulang kali dari saluran sehingga ditutup. Gelung berakhir sebaik sahaja pengirim selesai dan menutup saluran.

Anda boleh membuat saluran baharu untuk setiap carian selari dan setelah semua coroutine pekerja selesai, anda boleh menutup saluran tersebut. Ini akan menamatkan gelung penerima (nota: jangan tutup saluran dari bahagian penerima kerana pengirim tidak akan tahu dan menghantar ke saluran tertutup akan menyebabkan panik).

Atas ialah kandungan terperinci Skop saluran penimbal dalam Go disekat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!