Seni Pengaturcaraan Serentak di Golang: Cara Menggunakan Goroutine dengan Elegan
Pengenalan:
Dalam bidang pembangunan perisian hari ini, prestasi konkurensi yang tinggi adalah salah satu isu penting yang diberi perhatian oleh pembangun. Goroutines ialah ciri pengaturcaraan serentak yang unik dalam bahasa Golang yang membolehkan kami melaksanakan konkurensi dengan cara yang ringkas dan cekap. Artikel ini akan memperkenalkan seni pengaturcaraan serentak menggunakan Goroutines dan memberikan beberapa contoh untuk membantu pembaca memahami dengan lebih baik.
1. Apakah itu Goroutines?
Goroutines ialah pelaksanaan utas ringan dalam bahasa Golang. Goroutine mempunyai overhed memori yang lebih kecil dan masa permulaan yang lebih cepat daripada rangkaian tradisional. Goroutines menjadikannya sangat mudah untuk melaksanakan operasi serentak tanpa perlu mengendalikan penciptaan dan pemusnahan benang secara eksplisit. Di Golang, kita boleh menggunakan kata kunci "go" untuk memulakan Goroutine, seperti yang ditunjukkan di bawah:
go func() { // 并发执行的代码 }()
Dalam kod di atas, kami menggunakan fungsi tanpa nama untuk mentakrifkan blok kod yang dilaksanakan serentak dan menggunakan kata kunci "go" untuk memulakannya untuk Goroutine. Dengan cara ini, blok kod akan dilaksanakan secara serentak tanpa menyekat utas utama program.
2. Penggunaan Goroutines yang elegan
package main import ( "fmt" "sync" "time" ) func worker(id int, wg *sync.WaitGroup) { defer wg.Done() fmt.Printf("Worker %d开始工作 ", id) time.Sleep(time.Second) // 模拟一段耗时的工作 fmt.Printf("Worker %d工作完毕 ", id) } func main() { var wg sync.WaitGroup for i := 0; i < 5; i++ { wg.Add(1) go worker(i, &wg) } wg.Wait() fmt.Println("所有Worker工作已完成") }
Dalam kod di atas, kami mula-mula mencipta wg pembolehubah jenis penyegerakan.WaitGroup untuk menunggu semua Goroutine selesai. Kemudian dalam gelung, tingkatkan pembilang WaitGroup melalui wg.Add(1), menunjukkan bahawa terdapat Goroutine untuk menunggu. Dalam fungsi pekerja, kami menggunakan defer wg.Done() untuk menunjukkan bahawa Goroutine telah menyelesaikan kerjanya. Akhir sekali, panggil wg.Wait() dalam fungsi utama untuk menunggu semua Goroutines selesai.
package main import ( "fmt" "time" ) func producer(ch chan<- int) { for i := 0; i < 5; i++ { ch <- i // 将数据发送到通道ch中 time.Sleep(time.Second) // 模拟生产过程 } close(ch) // 关闭通道 } func consumer(ch <-chan int, done chan<- bool) { for num := range ch { // 从通道ch中接收数据 fmt.Println("接收到数据:", num) } done <- true } func main() { ch := make(chan int) // 创建通道ch done := make(chan bool) // 创建完成信号通道 go producer(ch) // 启动生产者Goroutine go consumer(ch, done) // 启动消费者Goroutine <-done // 等待消费者Goroutine完成 fmt.Println("所有数据已处理") }
Dalam kod di atas, kami mula-mula mencipta fungsi pengeluar untuk menghasilkan data dan fungsi pengguna untuk menggunakan data. Kami menghantar data antara dua fungsi ini melalui saluran ch. Dalam fungsi utama, kami menggunakan fungsi make untuk mencipta saluran ch dan saluran isyarat siap. Kemudian mulakan dua Goroutine, pengeluar dan pengguna, melalui kata kunci go, dan gunakan <-done untuk menunggu Goroutine pengguna selesai.
Kesimpulan:
Golang’s Goroutines memberikan kami cara yang ringkas dan cekap untuk menulis kod serentak. Dengan menggunakan WaitGroup dan saluran dengan sewajarnya, kami boleh mengendalikan kebergantungan dan komunikasi antara Goroutine dengan lebih elegan. Saya berharap kod contoh dalam artikel ini dapat membantu pembaca lebih memahami seni pengaturcaraan serentak di Golang, sekali gus meningkatkan keupayaan pengaturcaraan serentak mereka.
Atas ialah kandungan terperinci Seni Pengaturcaraan Serentak di Golang: Cara Menggunakan Goroutine dengan Elegan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!