Threading Goroutines dalam Go: Menjalankan Nombor Malar Serentak
Alam Go concurrency menawarkan banyak bahan untuk menunggu penyiapan bilangan goroutine yang ditentukan. Walau bagaimanapun, cabaran yang berbeza muncul dengan sendirinya: memastikan pelaksanaan berterusan bilangan goroutin yang telah ditetapkan, dengan satu bermula apabila satu lagi berakhir.
Pertimbangkan senario dengan kuantiti tugasan yang banyak, seperti memproses data yang diambil daripada MySQL pangkalan data. Pendekatan naif mungkin memulakan sejumlah besar goroutin selari, pada masa yang sama melaksanakan ratusan ribu tugas. Sebaliknya, gelagat yang diingini mengehadkan gorout yang berjalan serentak kepada kiraan tetap (katakan, 20).
Corak konkurensi terkawal ini dikenali sebagai "keselarian sempadan." Melaksanakan corak ini dalam Go memerlukan penggunaan saluran struct kosong sebagai semafor, menentukan bilangan maksimum goroutin pekerja serentak. Berikut ialah ilustrasi:
package main import "fmt" func main() { maxGoroutines := 10 guard := make(chan struct{}, maxGoroutines) for i := 0; i < 30; i++ { guard <- struct{}{} // blocks if guard channel is full go func(n int) { worker(n) <-guard // unlocks a slot in guard }(i) } } func worker(i int) { fmt.Println("doing work on", i) }
Pelaksanaan ini memastikan bahawa tidak lebih daripada bilangan goroutine yang ditetapkan dilaksanakan serentak. Akibatnya, apabila goroutine pekerja selesai, goroutine baharu segera dilancarkan, mengekalkan tahap konkurensi yang diingini.
Artikel "Go Concurrency Patterns" meneroka lebih lanjut konsep ini dalam bahagian "Bounded parallelism"nya, memberikan lebih mendalam cerapan tentang teknik konkurensi yang penting ini.
Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Bilangan Malar Goroutine yang Dijalankan Secara Serentak dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!