Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengaturcaraan berbilang benang Golang: terokai potensi tanpa had Goroutines

Pengaturcaraan berbilang benang Golang: terokai potensi tanpa had Goroutines

WBOY
WBOYasal
2023-07-17 14:13:201206semak imbas

Pengaturcaraan berbilang benang Golang: Meneroka potensi tanpa had Goroutines

Pengenalan:
Dalam era Internet yang sangat serentak hari ini, cara mengendalikan sebilangan besar tugas selari dengan cekap adalah cabaran penting yang dihadapi oleh pengaturcara. Sebagai bahasa pengaturcaraan taip statik yang berkuasa, Golang sangat dihormati kerana keupayaan konkurensi yang sangat baik. Artikel ini akan memperkenalkan konsep Goroutines di Golang dan menunjukkan cara menggunakan Goroutines untuk mencapai pengaturcaraan berbilang benang yang cekap melalui contoh kod.

1. Konsep Goroutines
Goroutine ialah unit pelaksanaan ringan, serupa dengan benang tradisional, tetapi ciptaan dan pemusnahannya jauh lebih kecil. Goroutines boleh melaksanakan secara serentak dengan Goroutines lain tanpa memerlukan mekanisme penguncian yang jelas untuk menjamin akses yang saling eksklusif kepada sumber yang dikongsi. Ini menjadikan pengaturcaraan berbilang benang di Golang lebih mudah dan cekap.

Di Golang, kita boleh mencipta Goroutine baharu melalui kata kunci "pergi" dan biarkan ia berjalan di latar belakang. Berikut ialah kod sampel:

package main

import (
    "fmt"
    "time"
)

func hello() {
    fmt.Println("Hello Goroutine!")
}

func main() {
    go hello() // 创建并运行一个Goroutine
    fmt.Println("Main Goroutine")
    time.Sleep(time.Second) // 等待一段时间以确保Goroutine有足够的时间完成执行
}

Dalam kod, kami mentakrifkan fungsi hello, yang akan mengeluarkan "Hello Goroutine!" Dalam fungsi utama, kami menggunakan kata kunci "pergi" untuk mencipta dan menjalankan Goroutine baharu, yang akan melaksanakan fungsi helo di latar belakang. Pada masa yang sama, kami mengeluarkan "Main Goroutine" dalam Goroutine utama. Untuk memastikan fungsi helo mempunyai masa yang mencukupi untuk dilaksanakan, kami menggunakan fungsi Tidur dalam pakej masa untuk berhenti seketika.

Hasil keluaran adalah seperti berikut:

Main Goroutine
Hello Goroutine!

Anda boleh melihat bahawa output "Hello Goroutine!" adalah selepas "Goroutine Utama", menunjukkan bahawa kedua-dua Goroutine dilaksanakan secara selari. Inilah kuasa Goroutines.

2. Gunakan Goroutines untuk mencapai pengkomputeran serentak
Selain melaksanakan tugas selari yang mudah, Goroutines juga boleh digunakan untuk tugas pengkomputeran yang lebih kompleks. Berikut mengambil pengiraan jujukan Fibonacci sebagai contoh untuk menunjukkan cara menggunakan Goroutines untuk mempercepatkan proses pengiraan.

package main

import (
    "fmt"
)

func fibonacci(n int) int {
    if n <= 0 {
        return 0
    }
    if n == 1 {
        return 1
    }
    return fibonacci(n-1) + fibonacci(n-2)
}

func fibonacciConcurrent(n int, c chan int) {
    c <- fibonacci(n)
}

func main() {
    n := 10
    c := make(chan int)
    for i := 0; i <= n; i++ {
        go fibonacciConcurrent(i, c)
    }
    for i := 0; i <= n; i++ {
        fmt.Println(<-c)
    }
}

Dalam kod di atas, kami mentakrifkan fungsi fibonacci untuk mengira nombor ke-n bagi jujukan Fibonacci. Kami juga mentakrifkan fungsi fibonacciConcurrent yang menghantar hasil pengiraan ke saluran c jenis chan int. Dalam fungsi utama, kami mencipta saluran c dan menggunakan gelung for untuk memulakan n Goroutines untuk mengira n nombor pertama jujukan Fibonacci. Akhir sekali, kami mengeluarkan hasil pengiraan dengan menerima data daripada saluran c.

Dengan menggunakan Goroutines untuk pengkomputeran selari, kami boleh meningkatkan kecekapan pengiraan urutan Fibonacci dengan ketara.

3. Penjadualan dan penyegerakan Goroutines
Dalam pengaturcaraan serentak, penjadualan dan penyegerakan adalah konsep yang sangat penting. Penjadualan Goroutines dilengkapkan secara automatik oleh sistem masa jalan Golang, dan pengaturcara tidak perlu terlalu risau. Tetapi dalam beberapa kes, kita mungkin perlu mengawal penyegerakan Goroutines secara manual.

Contoh kod berikut menunjukkan cara menggunakan pakej penyegerakan dalam Golang untuk melaksanakan penyegerakan Goroutines:

package main

import (
    "fmt"
    "sync"
)

func greet(name string, wg *sync.WaitGroup) {
    defer wg.Done() // Goroutine执行完毕后通知WaitGroup,表示该Goroutine已完成
    fmt.Printf("Hello, %s!
", name)
}

func main() {
    var wg sync.WaitGroup
    names := []string{"Alice", "Bob", "Charlie", "David"}

    for _, name := range names {
        wg.Add(1) // 增加WaitGroup的计数器
        go greet(name, &wg)
    }

    wg.Wait() // 等待所有Goroutines完成

    fmt.Println("All of the Goroutines have completed!")
}

Dalam kod di atas, kami mentakrifkan fungsi salam yang mencetak parameter nama yang diluluskan ke konsol dan memanggil wg.Done() memberitahu WaitGroup bahawa Goroutine telah selesai. Dalam fungsi utama, kami mencipta wg pembolehubah jenis penyegerakan.WaitGroup dan memulakan berbilang Goroutine menggunakan gelung for. Selepas setiap Goroutine dilaksanakan, WaitGroup dimaklumkan dengan memanggil wg.Done(), dan kemudian Goroutine utama menunggu semua Goroutine selesai dengan memanggil wg.Wait().

Ringkasan:
Artikel ini memperkenalkan konsep Goroutines di Golang dan menunjukkan cara menggunakan Goroutines untuk mencapai pengaturcaraan berbilang benang yang cekap melalui contoh kod. Ciri-ciri pelaksanaan yang ringan dan selari Goroutines menjadikan Golang sebagai bahasa pengaturcaraan yang sangat sesuai untuk mengendalikan tugas serentak. Dengan kajian dan amalan Golang yang mendalam, kami boleh menemui lebih banyak potensi tanpa had untuk menggunakan Goroutines. Saya harap artikel ini dapat memberi inspirasi kepada pembaca dalam pengaturcaraan berbilang benang.

Atas ialah kandungan terperinci Pengaturcaraan berbilang benang Golang: terokai potensi tanpa had 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