Menyegerakkan Goroutine dengan Konteks
Dalam Go, terdapat cabaran apabila bekerja dengan goroutine: memastikan penamatan yang teratur. Pertimbangkan senario dengan berbilang goroutine yang beroperasi secara berasingan, tetapi anda mahu ia disegerakkan supaya apabila satu goroutine selesai, yang lain juga harus keluar.
Coretan kod yang disediakan termasuk dua goroutine yang terus dijalankan. Jika ralat berlaku dalam satu goroutine, anda berhasrat untuk menamatkan kedua-duanya. Menggunakan saluran untuk isyarat siap boleh menyebabkan panik kerana menulis kepada saluran tertutup.
Pendekatan yang disyorkan untuk senario sedemikian ialah menggunakan pakej konteks Go, yang membolehkan komunikasi antara gorouti.
Dalam contoh kod di bawah, konteks latar belakang dicipta dengan fungsi cancel menggunakan context.WithCancel. Penyegerakan.WaitGroup dibuat untuk menjejak bilangan gorouti yang sedang berjalan.
package main import ( "context" "sync" ) func main() { ctx, cancel := context.WithCancel(context.Background()) wg := sync.WaitGroup{} wg.Add(3)
Tiga goroutine dimulakan. Dua goroutine pertama terus berjalan, menunggu isyarat daripada konteks. Setelah menerima isyarat, mereka keluar dengan anggun.
go func() { defer wg.Done() for { select { // msg from other goroutine finish case <-ctx.Done(): // end } } }() go func() { defer wg.Done() for { select { // msg from other goroutine finish case <-ctx.Done(): // end } } }()
Groutine ketiga menjalankan operasi dan kemudian memanggil fungsi batal untuk menandakan selesainya tugasnya. Tindakan ini menggesa konteks ditutup, mencetuskan dua goroutine yang lain untuk keluar.
go func() { defer wg.Done() // your operation // call cancel when this goroutine ends cancel() }()
Akhir sekali, fungsi wg.Wait menunggu sehingga ketiga-tiga goroutine selesai sebelum rutin utama keluar.
wg.Wait() }
Pendekatan berasaskan konteks ini memastikan bahawa apabila mana-mana goroutine selesai, yang lain dimaklumkan dan ditamatkan dengan baik, menyediakan cara yang bersih dan cekap untuk mengendalikan penyegerakan goroutine.
Atas ialah kandungan terperinci Bagaimanakah Pakej Konteks Go Memastikan Penamatan Berbilang Goroutine dengan Anggun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!