Kemahiran pengaturcaraan serentak tinggi Golang: Pemahaman mendalam tentang strategi penjadualan Goroutines
Pengenalan: Golang ialah bahasa konkurensi tinggi, dan benang ringan terbina dalam Goroutines ialah salah satu ciri teras pengaturcaraan serentak. Artikel ini akan menyelidiki strategi penjadualan Goroutines dan cara mengoptimumkan prestasi program serentak melalui penggunaan strategi penjadualan yang munasabah.
1. Strategi penjadualan Goroutines
Goroutines adalah rangkaian ringan Golang Berbanding dengan rangkaian sistem pengendalian tradisional, penjadualan Goroutines adalah lebih fleksibel dan cekap. Golang menggunakan komponen yang dipanggil penjadual untuk memutuskan Goroutine yang hendak dilaksanakan dan bila. Di Golang, kami secara amnya tidak perlu mengawal penjadualan Goroutines secara manual, tetapi penjadual melakukannya secara automatik.
Strategi penjadualan Goroutines terutamanya merangkumi tiga aspek: penjadualan preemptive, penjadualan kolaboratif dan Curi Kerja.
Penjadual Golang menggunakan strategi penjadualan awalan, iaitu, pelaksanaan mana-mana Goroutine mungkin diganggu oleh Goroutine lain pada bila-bila masa. Kelebihan strategi penjadualan ini ialah ia boleh memperuntukkan sumber CPU secara munasabah dan menghalang Goroutine tertentu daripada memonopoli CPU untuk jangka masa yang lama, menyebabkan Goroutine lain tidak dapat melaksanakan. Apabila Goroutine didahulukan, penjadual menyimpan keadaannya dan beralih kepada Goroutine boleh laku lain.
Selain penjadualan awalan, penjadual Golang juga menggunakan strategi penjadualan kolaboratif. Dalam penjadualan koperasi, Goroutine secara automatik akan melepaskan hak pelaksanaan CPU dan bukannya menduduki CPU sepanjang masa. Dengan secara aktif melepaskan CPU pada masa yang sesuai dan bertukar antara Goroutines secara munasabah, prestasi serentak keseluruhan sistem boleh dipertingkatkan.
Mencuri Kerja adalah mekanisme yang sangat penting dalam penjadual Golang. Idea terasnya adalah untuk membenarkan utas terbiar "mencuri" tugasan secara aktif daripada utas lain untuk dilaksanakan, dengan itu mencapai pengimbangan beban antara utas. Mekanisme ini boleh mengelakkan situasi di mana beberapa utas berfungsi terlalu banyak manakala utas lain kekal melahu, meningkatkan lagi prestasi program serentak.
2. Contoh demonstrasi strategi penjadualan
Untuk lebih memahami strategi penjadualan Goroutines, mari lihat contoh kod mudah untuk meneroka kesan strategi penjadualan yang berbeza pada program serentak.
package main import ( "fmt" "runtime" "sync" ) func main() { runtime.GOMAXPROCS(1) // 设置只使用一个CPU核心 var wg sync.WaitGroup wg.Add(2) fmt.Println("Start Goroutines") // 第一个Goroutine go func() { defer wg.Done() for i := 0; i < 3; i++ { fmt.Println("Goroutine 1: ", i) } }() // 第二个Goroutine go func() { defer wg.Done() for i := 0; i < 3; i++ { fmt.Println("Goroutine 2: ", i) } }() fmt.Println("Waiting to finish") wg.Wait() fmt.Println("Terminating the program") }
Dalam kod di atas, kami menetapkan hanya satu teras CPU melalui runtime.GOMAXPROCS(1)
untuk melihat dengan lebih baik kesan strategi penjadualan yang berbeza. runtime.GOMAXPROCS(1)
设置只使用一个CPU核心,以便更好地观察不同调度策略的效果。
在运行示例代码时,我们可以观察到以下几种不同调度策略的效果:
通过不断调整runtime.GOMAXPROCS
Hanya satu Goroutine sedang melaksanakan. Dalam kes ini, Goroutine yang selesai melaksanakan terlebih dahulu akan melepaskan CPU dan melaksanakan Goroutine lain.
Dua Goroutine dilaksanakan secara bergilir-gilir. Dalam kes ini, kerana hanya terdapat satu teras CPU, Goroutines akan menukar pelaksanaan antara satu sama lain.
runtime.GOMAXPROCS
dan memerhatikan output program, kita boleh mempunyai pemahaman yang lebih mendalam tentang kesan strategi penjadualan yang berbeza pada program serentak. Atas ialah kandungan terperinci Kemahiran pengaturcaraan serentak tinggi Golang: pemahaman mendalam tentang strategi penjadualan Goroutines. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!