Amalan pengaturcaraan serentak yang cekap: Petua penggunaan Go WaitGroup di Golang
Pengenalan: Pengaturcaraan serentak ialah bahagian penting dalam bidang pembangunan perisian hari ini. Dalam sistem berskala besar, pemprosesan serentak yang cekap boleh meningkatkan prestasi dan daya pemprosesan sistem dengan ketara. Sebagai bahasa yang menekankan keselarasan, Golang menyediakan pelbagai alatan dan ciri pengaturcaraan serentak. Salah satunya ialah WaitGroup. Artikel ini akan memperkenalkan kemahiran penggunaan WaitGroup di Golang dan memberikan contoh kod khusus.
1. Apakah itu WaitGroup?
WaitGroup ialah primitif penyegerakan serentak di Golang, yang digunakan untuk menunggu penyiapan kumpulan goroutin. Biasanya kaedah Tambah WaitGroup digunakan dalam goroutine utama untuk menetapkan bilangan goroutine yang perlu ditunggu, dan kemudian kaedah Tunggu digunakan untuk menunggu semuanya selesai.
2. Penggunaan asas WaitGroup
Berikut ialah contoh penggunaan asas WaitGroup:
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup // 设置需要等待的goroutine数 wg.Add(2) // 启动goroutine go printMessage("Hello", &wg) go printMessage("World", &wg) // 等待所有goroutine完成 wg.Wait() fmt.Println("All goroutines finished.") } func printMessage(message string, wg *sync.WaitGroup) { // 在函数结束时通知WaitGroup当前goroutine已经完成 defer wg.Done() fmt.Println(message) time.Sleep(time.Second) }
Dalam contoh di atas, kami mencipta objek WaitGroup wg dan menggunakan kaedah Tambah untuk menunjukkan bahawa bilangan goroutine untuk menunggu ialah 2. Kemudian, kami memulakan dua goroutine untuk melaksanakan fungsi printMessage, dan setiap goroutine mengeluarkan mesej selepas satu saat. Dalam fungsi printMessage, kami menggunakan defer wg.Done()
来通知WaitGroup当前goroutine已经完成。最后,我们使用wg.Wait()
untuk menunggu semua goroutine selesai.
3. Kemahiran biasa WaitGroup
Selain penggunaan asas, kami juga boleh menggunakan WaitGroup dalam kombinasi dengan ciri lain untuk melaksanakan teknik pengaturcaraan serentak yang cekap. Berikut ialah beberapa teknik biasa:
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup names := []string{"Alice", "Bob", "Charlie"} // 设置需要等待的goroutine数 wg.Add(len(names)) for _, name := range names { go func(n string) { // 在函数结束时通知WaitGroup当前goroutine已经完成 defer wg.Done() fmt.Println("Hello,", n) }(name) } // 等待所有goroutine完成 wg.Wait() fmt.Println("All goroutines finished.") }
Dalam contoh di atas, kami menggunakan WaitGroup digabungkan dengan fungsi tanpa nama untuk memproses senarai nama secara serentak. Dengan menggunakan fungsi tanpa nama di dalam gelung, kita boleh mengikat goroutine pada operasi tertentu, dengan itu mengelakkan kemungkinan keadaan perlumbaan. . Ini memastikan bahawa dua goroutine pertama disiapkan sebelum memulakan goroutine ketiga.
Atas ialah kandungan terperinci Amalan pengaturcaraan serentak yang cekap: Petua penggunaan Go WaitGroup di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!