Dengan pembangunan berterusan perkakasan komputer, teras CPU dalam pemproses tidak lagi meningkatkan kekerapan jam secara individu, tetapi meningkatkan bilangan teras. Ini menimbulkan persoalan yang jelas: Bagaimana untuk memanfaatkan sepenuhnya teras ini?
Satu penyelesaian adalah melalui pengaturcaraan selari, yang melaksanakan pelbagai tugas serentak untuk menggunakan sepenuhnya teras CPU. Ini adalah satu perkara yang unik tentang bahasa Go, ia adalah bahasa yang direka untuk pengaturcaraan serentak.
Dalam artikel ini, kami akan meneroka cara menggunakan bahasa Go untuk pengaturcaraan serentak.
Pertama sekali, perkara yang perlu kita fahami ialah mekanisme khas dalam bahasa Go: coroutine. Coroutine ialah benang ringan yang boleh menukar pelaksanaan beberapa kali dalam satu utas untuk mencapai pelaksanaan selari.
Berbanding dengan rangkaian sistem pengendalian, kos penukaran coroutine adalah sangat rendah. Ia diuruskan oleh masa jalan Go, yang menggunakan pemetaan m:n untuk memetakan coroutine pada n urutan sistem pengendalian. Ini menjadikan bahasa Go sangat cekap dan stabil dalam keupayaan pelaksanaan serentak.
Dalam bahasa Go, anda boleh menggunakan kata kunci go
untuk memulakan coroutine. Contohnya:
func main() { go hello() } func hello() { fmt.Println("Hello, world!") }
Dalam kod di atas, fungsi hello()
akan dilaksanakan dalam coroutine baharu. Apabila atur cara keluar daripada fungsi main()
, fungsi hello()
mungkin masih dilaksanakan, jadi atur cara tidak akan keluar serta-merta.
Komunikasi antara coroutine adalah sangat penting kerana mereka perlu berkongsi data. Terdapat jenis pembolehubah khas dalam bahasa Go yang dipanggil saluran, yang digunakan untuk memindahkan data antara coroutine.
Saluran boleh dibuat melalui fungsi make()
, contohnya:
ch := make(chan int)
Kod di atas akan mencipta saluran jenis integer.
Data boleh dihantar melalui operasi hantar dan terima saluran. Saluran boleh dihantar dan diterima menggunakan operator <-
. Contohnya: Operator
ch <- 42 // 发送数据 x := <-ch // 接收数据
<-
boleh digunakan di sebelah kiri atau kanan untuk menghantar atau menerima data. Jika saluran tidak dibuffer, operasi hantar akan disekat sehingga coroutine lain menerima data. Begitu juga, jika tiada data tersedia, operasi terima akan disekat.
Apabila memproses berbilang coroutine, anda mungkin perlu menunggu kesemuanya untuk menyelesaikan pelaksanaan. Anda boleh menggunakan sync.WaitGroup
untuk tujuan ini. Contohnya:
func main() { var wg sync.WaitGroup wg.Add(2) // 增加计数器 go func() { defer wg.Done() // 完成时减少计数器 fmt.Println("Hello,") }() go func() { defer wg.Done() // 完成时减少计数器 fmt.Println("world!") }() wg.Wait() // 等待协程全部完成 }
Dalam kod di atas, wg
ialah objek sync.WaitGroup
yang mengandungi pembilang. Kaedah Add()
menambah kaunter, menunjukkan bilangan coroutine yang perlu menunggu. Kaedah Done()
mengurangkan kaunter untuk menunjukkan bahawa coroutine telah selesai. Kaedah Wait()
akan menunggu sehingga kaunter mencapai sifar.
Berikut ialah contoh program yang menunjukkan cara memanfaatkan coroutine dan saluran untuk pengaturcaraan serentak:
func main() { ch := make(chan int) go func() { for i := 0; i < 10; i++ { ch <- i // 发送数据 } close(ch) // 关闭通道 }() for i := range ch { // 循环接收数据,直到通道关闭 fmt.Println(i) } }
Dalam kod di atas, kami mencipta saluran jenis integer ch
. Kami kemudian menghantar integer dari 0 hingga 9 ke saluran dalam coroutine baharu. Akhir sekali, kami menggunakan kata kunci range
untuk mengulung data dalam saluran dan mencetaknya.
Perhatikan bahawa kami menutup saluran melalui kaedah close()
selepas menghantar semua data. Ini membolehkan coroutine yang menggelung membaca saluran untuk keluar.
Dalam artikel ini, kami mempelajari tentang coroutine, saluran dan WaitGroup
dalam bahasa Go. Melalui mekanisme ini, pengaturcaraan serentak yang cekap boleh dilaksanakan dengan mudah. Semasa menulis kod Go, pastikan anda mempertimbangkan untuk menggunakan mekanisme ini untuk menggunakan sepenuhnya teras CPU dan sumber perkakasan.
Atas ialah kandungan terperinci Bagaimana untuk menggunakan bahasa Go untuk pengaturcaraan serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!