Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Skop saluran penimbal dalam Go disekat

Skop saluran penimbal dalam Go disekat

WBOY
WBOYke hadapan
2024-02-09 09:42:30659semak imbas

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

Output

1
2

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,
    })

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam