Rumah >pembangunan bahagian belakang >Golang >Kemahiran pengaturcaraan serentak tinggi Golang: pemahaman mendalam tentang strategi penjadualan Goroutines

Kemahiran pengaturcaraan serentak tinggi Golang: pemahaman mendalam tentang strategi penjadualan Goroutines

PHPz
PHPzasal
2023-07-17 12:42:071327semak imbas

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.

  1. Penjadualan preemptif

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.

  1. Penjadualan kolaboratif

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.

  1. Mencuri Kerja

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核心,以便更好地观察不同调度策略的效果。

在运行示例代码时,我们可以观察到以下几种不同调度策略的效果:

  1. 只有一个Goroutine在执行。在这种情况下,先执行完的Goroutine会释放CPU并执行其他Goroutine。
  2. 两个Goroutine交替执行。在这种情况下,由于只有一个CPU核心,Goroutine之间会相互切换执行。
  3. 一个Goroutine完全执行完毕后,另一个Goroutine才开始执行。

通过不断调整runtime.GOMAXPROCS

Apabila menjalankan kod sampel, kita boleh melihat kesan strategi penjadualan berbeza berikut:

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.

    Selepas satu Goroutine dilaksanakan sepenuhnya, Goroutine lain mula melaksanakan.
  1. Dengan sentiasa melaraskan nilai runtime.GOMAXPROCS dan memerhatikan output program, kita boleh mempunyai pemahaman yang lebih mendalam tentang kesan strategi penjadualan yang berbeza pada program serentak.
Kesimpulan: 🎜🎜Dengan memahami secara mendalam strategi penjadualan Goroutines, kami boleh menilai dengan lebih baik prestasi program Golang dan mengoptimumkan kesan larian program serentak. Dengan menetapkan strategi penjadualan yang munasabah dan menulis kod konkurensi yang cekap, kami boleh memberikan permainan penuh kepada ciri konkurensi tinggi bahasa Golang dan meningkatkan prestasi dan kestabilan program. 🎜🎜Rujukan: 🎜🎜🎜https://golang.org/doc/effective_go.html#goroutines🎜🎜https://blog.golang.org/scheduler🎜🎜

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn