Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan Serentak Golang: Pemahaman mendalam tentang prinsip dan penggunaan Goroutines

Pengaturcaraan Serentak Golang: Pemahaman mendalam tentang prinsip dan penggunaan Goroutines

WBOY
WBOYasal
2023-07-17 22:34:451312semak imbas

Pengaturcaraan serentak Golang: Pemahaman mendalam tentang prinsip dan penggunaan Goroutines

[Pengenalan]
Dengan peningkatan bilangan teras pemproses komputer, pengaturcaraan berbilang benang telah menjadi cara penting untuk meningkatkan prestasi aplikasi dan responsif. Walau bagaimanapun, model pengaturcaraan berbilang benang tradisional mempunyai kerumitan dan kesukaran tertentu dalam pelaksanaan dan penyahpepijatan. Di Golang, Goroutines menyediakan cara pengaturcaraan serentak yang mudah dan berkuasa Artikel ini akan menyelidiki prinsip dan penggunaan Goroutines.

[Prinsip Goroutines]
Goroutines ialah rangkaian ringan Golang, yang dijadualkan oleh sistem masa jalan bahasa Go (Goruntime). Berbanding dengan benang biasa, penciptaan dan pemusnahan overhed Goroutines adalah sangat kecil, jadi sejumlah besar Goroutines boleh dibuat untuk melaksanakan tugas secara serentak.

Pelaksanaan Goroutines adalah berdasarkan model benang M:N, yang memetakan urutan M Goroutines kepada N sistem pengendalian. Dengan cara ini, berbilang Goroutine boleh dilaksanakan pada masa yang sama, sama ada pada komputer teras tunggal atau berbilang teras, untuk menggunakan sepenuhnya prestasi sumber pengkomputeran.

【Penciptaan dan Penjadualan Goroutines】
Di Golang, anda boleh mencipta Goroutine menggunakan kata kunci go. Berikut ialah contoh kod mudah:

func main() {
    go printHello()
    fmt.Println("Main Goroutine")
    time.Sleep(time.Second)
}

func printHello() {
    time.Sleep(time.Second)
    fmt.Println("Hello Goroutine")
}

Dalam kod di atas, fungsi printHello dicipta sebagai Goroutine, yang akan dilaksanakan secara tak segerak. Dalam fungsi utama, kita dapat melihat bahawa atur cara pertama akan mengeluarkan "Goroutine Utama", kemudian tunggu selama satu saat dan kemudian mengeluarkan "Hello Goroutine".

Goruntime bertanggungjawab untuk penjadualan Goroutines, yang memperuntukkan Goroutines untuk dilaksanakan kepada urutan sistem pengendalian yang tersedia. Pada urutan sistem pengendalian, Goruntime mengekalkan baris gilir Goroutine dan memilih Goroutine seterusnya untuk dilaksanakan berdasarkan dasar penjadualan. Jika Goroutine disekat (seperti menunggu operasi I/O), Goruntime akan menggantungnya buat sementara waktu dan menukar pelaksanaan dalam Goroutine lain.

【Komunikasi antara Goroutines】
Dalam pengaturcaraan serentak, Goroutines perlu berkomunikasi dan berkongsi data. Golang menyediakan Saluran untuk mencapai matlamat ini. Saluran ialah jenis khas di Golang yang membolehkan Goroutine menghantar dan menerima data antara satu sama lain dengan selamat.

Berikut ialah contoh kod untuk komunikasi menggunakan saluran:

func main() {
    ch := make(chan string)
    go sendMessage(ch, "Hello Goroutine!")
    msg := <-ch
    fmt.Println(msg)
}

func sendMessage(ch chan<- string, msg string) {
    time.Sleep(time.Second)
    ch <- msg
}

Dalam kod di atas, kami mencipta saluran jenis rentetan dan menggunakan kata kunci go untuk memulakan fungsi sendMessage sebagai Goroutine. Fungsi sendMessage akan menghantar mesej ke saluran. Dalam fungsi utama, kami menggunakan sintaks <-ch untuk menerima mesej daripada saluran dan mencetaknya.

[Penyegerakan dan Pengecualian Bersama Goroutines]
Apabila berbilang Goroutines mengakses sumber dikongsi pada masa yang sama, masalah keadaan perlumbaan mungkin berlaku. Untuk memastikan ketepatan dan ketekalan sumber, Golang menyediakan kunci mutex (Mutex) dan kunci baca-tulis (RWMutex) untuk mencapai penyegerakan sumber dan pengecualian bersama.

Berikut ialah contoh kod untuk penyegerakan menggunakan mutex:

func main() {
    var counter int
    var wg sync.WaitGroup
    var mu sync.Mutex

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(&counter, &wg, &mu)
    }

    wg.Wait()
    fmt.Println("Counter:", counter)
}

func increment(counter *int, wg *sync.WaitGroup, mu *sync.Mutex) {
    mu.Lock()
    *counter++
    mu.Unlock()

    wg.Done()
}

Dalam kod di atas, kami mencipta pembolehubah pembilang kongsi dan melindunginya menggunakan mutex mu. Dalam fungsi kenaikan, kami menggunakan mu.Lock() dan mu.Unlock() untuk mengunci dan melepaskan mutex masing-masing.

【Ringkasan】
Melalui artikel ini kami telah mempelajari tentang prinsip dan penggunaan Goroutines dalam pengaturcaraan serentak Golang. Goroutines menyediakan kaedah pengaturcaraan serentak yang mudah dan berkuasa yang boleh menggunakan sepenuhnya sumber pengkomputeran. Kami belajar tentang penciptaan dan penjadualan Goroutines, komunikasi antara Goroutines dan cara menggunakan kunci mutex untuk penyegerakan. Saya harap artikel ini akan membantu anda mendapatkan pemahaman yang lebih mendalam tentang pengaturcaraan serentak Golang.

Atas ialah kandungan terperinci Pengaturcaraan Serentak Golang: Pemahaman mendalam tentang prinsip dan penggunaan 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