Apabila bekerja dengan senarai URL yang perlu diproses secara tidak segerak, selalunya wajar untuk mengehadkan bilangan goroutin serentak kepada mengelakkan sumber yang berlebihan. Penyelesaiannya melibatkan penciptaan saluran terhad yang mengawal bilangan maksimum goroutine yang boleh dilaksanakan secara serentak.
Dalam percubaan asal, saluran penimbal selari saiz telah dicipta:
<code class="go">results := make(chan string, *parallel)</code>
Niatnya ialah apabila saluran keputusan penuh, atur cara akan menyekat sehingga nilai dibaca daripada saluran, membolehkan goroutine lain dihasilkan. Walau bagaimanapun, pendekatan ini tidak mengehadkan bilangan goroutine dengan berkesan, kerana program utama tidak menyekat apabila semua URL telah diproses.
Penyelesaian yang lebih berkesan melibatkan penciptaan tetapan bilangan goroutin pekerja:
<code class="go">for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() }</code>
Dalam penyelesaian ini, gorouti bertanggungjawab untuk mengambil URL daripada saluran dan memprosesnya. Saluran ini diberi URL daripada goroutine feeder dan setelah semua URL diambil, goroutine feeder menutup saluran, memberi isyarat kepada pekerja untuk menyelesaikan tugas mereka.
Groutine berasingan memantau status penyiapan pekerja goroutine, menutup saluran keputusan apabila semua pekerja selesai. Pendekatan ini secara berkesan mengehadkan bilangan gorouti yang berjalan kepada kiraan selari yang ditentukan.
Atas ialah kandungan terperinci Bagaimana untuk Mengehadkan Rutin Pergi Serentak dengan Saluran dengan Berkesan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!