Isu pemasa concurrency dalam bahasa Go merujuk kepada beberapa isu berkaitan concurrency yang mungkin berlaku apabila berbilang goroutin perlu menggunakan pemasa pada masa yang sama. Untuk menyelesaikan masalah ini, bahasa Go menyediakan beberapa mekanisme dan teknik Artikel ini akan memperkenalkan penyelesaian ini secara terperinci dan memberikan contoh kod.
package main import ( "fmt" "time" ) func main() { ticker := time.NewTicker(1 * time.Second) go func() { for { <-ticker.C fmt.Println("Tick") } }() time.Sleep(5 * time.Second) ticker.Stop() fmt.Println("Ticker stopped") }
Dalam kod di atas, kami mencipta ticker dengan selang 1 saat, dan kemudian terus menerima acara daripada ticker saluran ticker.C dalam goroutine, dan Output "Tick" . Tunggu 5 saat dalam goroutine utama dan kemudian hentikan ticker. Menjalankan kod ini akan mengeluarkan keputusan berikut:
Tick Tick Tick Tick Tick Ticker stopped
package main import ( "context" "fmt" "time" ) func main() { ctx, cancel := context.WithCancel(context.Background()) go func() { for { select { case <-ctx.Done(): return case <-time.After(1 * time.Second): fmt.Println("Tick") } } }() time.Sleep(5 * time.Second) cancel() fmt.Println("Timer cancelled") }
Dalam kod di atas, kami mula-mula mencipta objek konteks ctx dengan fungsi pembatalan dan menyerahkannya kepada goroutine. Dalam goroutine, kami menggunakan pernyataan pilih untuk mendengar dua saluran: ctx.Done() dan time.After(). Apabila saluran ctx.Done() mempunyai nilai, ini bermakna konteks telah dibatalkan dan kita boleh keluar dari goroutine. Apabila saluran masa.Selepas() mempunyai nilai, ini bermakna masa telah tamat dan kami mencetak "Tick". Dalam goroutine utama, kami menunggu 5 saat dan kemudian memanggil fungsi cancel() untuk membatalkan pemasa. Menjalankan kod ini akan mengeluarkan hasil yang berikut:
Tick Tick Tick Tick Tick Timer cancelled
package main import ( "fmt" "sync" "time" ) func main() { var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() time.Sleep(2 * time.Second) fmt.Println("Timer 1 finished") }() go func() { defer wg.Done() time.Sleep(3 * time.Second) fmt.Println("Timer 2 finished") }() wg.Wait() fmt.Println("All timers finished") }
Dalam kod di atas, kami menggunakan sync.WaitGroup untuk menunggu tamat dua pemasa. Dalam goroutine setiap pemasa, kami menggunakan kata kunci tangguh untuk memanggil wg.Done() pada penghujung fungsi, menunjukkan bahawa goroutine semasa telah tamat. Dalam goroutine utama, kami memanggil wg.Wait() untuk menunggu semua pemasa tamat. Menjalankan kod ini akan mengeluarkan hasil berikut:
Timer 1 finished Timer 2 finished All timers finished
Ringkasan:
Artikel ini memperkenalkan tiga penyelesaian kepada masalah pemasa serentak dalam bahasa Go, iaitu menggunakan masa.Ticker, context.Context dan sync.WaitGroup. Melalui contoh kod, kami menerangkan secara terperinci penggunaan dan langkah berjaga-jaga bagi setiap skim. Penyelesaian ini boleh membantu pembangun menangani isu yang berkaitan dengan pemasa serentak dengan lebih baik dan meningkatkan kebolehpercayaan dan prestasi kod.
Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah pemasa serentak dalam bahasa Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!