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.
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")
1 2
Ini membuktikan 2 sumber memenuhi saluran (iaitu kapasiti maksimum).
Apa yang saya hilang di sini? never called
adalah, baik, tidak pernah dipanggil.
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, })
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!