Sync.WaitGroup: Alternatif Cekap kepada Saluran untuk Penyegerakan Goroutine
Apabila menyegerakkan goroutin dalam Go, kedua-dua penyegerakan.WaitGroup dan saluran biasanya corak terpakai. Walaupun kedua-dua kaedah boleh mencapai hasil yang serupa, terdapat kelebihan halus yang menjadikan penyegerakan.WaitGroup pilihan yang lebih sesuai dalam situasi tertentu.
Pertimbangkan senario berikut:
// Waitgroup example package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup func main() { words := []string{"foo", "bar", "baz"} for _, word := range words { wg.Add(1) go func(word string) { //... fmt.Println(word) wg.Done() }(word) } }
Dalam kes ini, penyegerakan .WaitGroup menyediakan mekanisme yang mudah untuk menjejaki bilangan gorout yang sedang berjalan dan menunggu kesemuanya selesai sebelum melaksanakan kod selanjutnya. Ini memudahkan untuk memastikan semua tugasan telah selesai sebelum meneruskan.
Sebaliknya, menggunakan saluran untuk tugasan ini boleh menjadi lebih kompleks dan terdedah kepada ralat:
// Channel example package main import ( "fmt" "time" ) func main() { words := []string{"foo", "bar", "baz"} done := make(chan bool, len(words)) for _, word := range words { //... fmt.Println(word) done <- true } for range words { <-done } }
Di sini, selesai saluran digunakan untuk menandakan selesainya setiap tugas, dan fungsi utama menyekat sehingga semua isyarat telah diterima. Walaupun pendekatan ini berfungsi bersamaan dengan penyegerakan.WaitGroup, ia memerlukan simpan kira tambahan dan pengendalian ralat untuk memastikan semua gorouti disegerakkan dengan betul.
Secara amnya, penyegerakan.WaitGroup diutamakan apabila kebimbangan utama adalah menyelaraskan penyiapan goroutines, manakala saluran lebih sesuai untuk senario yang melibatkan pertukaran data antara gorouti atau apabila kawalan halus ke atas penyegerakan diperlukan. Melainkan keperluan khusus memerlukan penggunaan saluran, sync.WaitGroup menawarkan penyelesaian yang lebih mudah dan lebih berprestasi untuk tugasan penyegerakan goroutine.
Atas ialah kandungan terperinci Bila hendak Pilih `sync.WaitGroup` berbanding Saluran untuk Penyegerakan Goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!