Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengalaman praktikal pengaturcaraan serentak Golang: daripada Goroutines kepada seni bina ketersediaan tinggi

Pengalaman praktikal pengaturcaraan serentak Golang: daripada Goroutines kepada seni bina ketersediaan tinggi

WBOY
WBOYasal
2023-07-19 08:05:28740semak imbas

Pengalaman Praktikal Pengaturcaraan Serentak Golang: Dari Goroutines ke Seni Bina Yang Sangat Tersedia

Pengenalan:
Golang ialah bahasa pengaturcaraan khusus untuk memudahkan pengaturcaraan serentak Mekanisme Goroutines dan Salurannya yang unik memudahkan untuk menulis program serentak yang cekap. Artikel ini akan berkongsi pengalaman praktikal saya dalam menggunakan Golang untuk pengaturcaraan serentak, daripada penggunaan Goroutine dan Saluran asas kepada amalan membina seni bina ketersediaan tinggi.

1. Goroutines: Unit asas konkurensi ringan
Groutines ialah unit asas untuk pengaturcaraan serentak di Golang. Ia lebih ringan daripada benang tradisional dan boleh dibuat dan dimusnahkan dengan cepat. Berikut ialah contoh mudah yang menunjukkan cara untuk mencipta Goroutines serentak dan melaksanakan tugasan:

package main

import "fmt"

func sayHello() {
    fmt.Println("Hello World!")
}

func main() {
    go sayHello()
    fmt.Println("Main function")
    // 等待Goroutines完成
    time.Sleep(time.Second)
}

Dalam contoh di atas, kami mencipta Goroutine menggunakan kata kunci go untuk melaksanakan sayHello( ) fungsi. Dalam fungsi utama, kami juga mencetak baris teks. Memandangkan Goroutines dan fungsi utama dilaksanakan dalam urutan yang berbeza, ia boleh dijalankan serentak. Akhir sekali, kami menggunakan fungsi time.Sleep untuk menunggu Goroutines menyelesaikan tugas mereka. go 关键字创建了一个Goroutine来执行 sayHello() 函数。在主函数中,我们也打印了一行文字。由于Goroutines和主函数在不同的线程中执行,所以它们可以并发地运行。最后,我们使用 time.Sleep 函数来等待Goroutines完成任务。

二、Channels:实现Goroutines之间的通信
Golang中的Channels用于Goroutines之间的通信,是一种非常强大的并发编程工具。下面是一个使用Channels进行传输的简单示例:

package main

import "fmt"

func sum(arr []int, ch chan int) {
    sum := 0
    for _, num := range arr {
        sum += num
    }
    ch <- sum
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    ch := make(chan int)
    go sum(arr[:len(arr)/2], ch)
    go sum(arr[len(arr)/2:], ch)
    x, y := <-ch, <-ch
    fmt.Println("Sum:", x+y)
}

在上面的示例中,我们定义了一个 sum 函数用于计算切片 arr 中的元素的总和,并将结果通过 ch 通道发送出去。在主函数中,我们首先创建了一个通道 ch,然后使用 go 关键字启动了两个Goroutines,同时计算切片的两部分的总和。最后,我们从 ch 通道接收结果并打印出总和。

三、构建高可用架构:利用Golang提供的并发机制
除了基本的Goroutines和Channels之外,Golang提供了很多其他有用的并发工具,可以用于构建高可用架构。下面是一个简单的示例,展示了如何使用 sync.WaitGroup 来实现并发任务的等待和同步:

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()

    fmt.Printf("Worker %d starting
", id)
    // 模拟一个耗时操作
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done
", id)
}

func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
    fmt.Println("All workers done")
}

在上面的示例中,我们定义了一个 worker 函数,并向其中传递一个 sync.WaitGroup 对象。在 worker 函数中,我们首先通过 wg.Done() 函数告知 WaitGroup 已完成一项任务。在主函数中,我们使用 wg.Add(1) 函数将每个Goroutine添加到 WaitGroup 中。最后,我们使用 wg.Wait()

2. Saluran: Melaksanakan komunikasi antara Goroutines

Saluran di Golang digunakan untuk komunikasi antara Goroutines dan merupakan alat pengaturcaraan serentak yang sangat berkuasa. Berikut ialah contoh mudah menggunakan Saluran untuk penghantaran:
rrreee

Dalam contoh di atas, kami mentakrifkan fungsi sum untuk mengira jumlah elemen dalam kepingan arr , dan hantar hasilnya melalui saluran ch. Dalam fungsi utama, kami mula-mula mencipta saluran ch dan kemudian menggunakan kata kunci go untuk memulakan dua Goroutine sambil mengira jumlah dua bahagian hirisan. Akhir sekali, kami menerima hasil daripada saluran ch dan mencetak jumlahnya. 🎜🎜3. Bina seni bina ketersediaan tinggi: Gunakan mekanisme konkurensi yang disediakan oleh Golang🎜Selain daripada Goroutine dan Saluran asas, Golang menyediakan banyak alat konkurensi berguna lain yang boleh digunakan untuk membina seni bina ketersediaan tinggi. Berikut ialah contoh mudah yang menunjukkan cara menggunakan sync.WaitGroup untuk melaksanakan menunggu dan penyegerakan tugas serentak: 🎜rrreee🎜Dalam contoh di atas, kami mentakrifkan fungsi pekerja dan berikannya objek sync.WaitGroup. Dalam fungsi worker, kami mula-mula memberitahu WaitGroup bahawa tugas telah diselesaikan melalui fungsi wg.Done(). Dalam fungsi utama, kami menambah setiap Goroutine pada WaitGroup menggunakan fungsi wg.Add(1). Akhir sekali, kami menggunakan fungsi wg.Wait() untuk menunggu semua Goroutine menyelesaikan tugas mereka. 🎜🎜Kesimpulan: 🎜Dengan menggunakan Goroutines, Saluran dan alat konkurensi lain yang disediakan oleh Golang, kerumitan pengaturcaraan serentak dapat dipermudahkan lagi. Dalam pembangunan sebenar, kami boleh menggunakan sepenuhnya mekanisme konkurensi Golang untuk membina seni bina yang sangat tersedia. Saya harap perkongsian artikel ini akan membantu anda dalam pengaturcaraan serentak Golang. 🎜

Atas ialah kandungan terperinci Pengalaman praktikal pengaturcaraan serentak Golang: daripada Goroutines kepada seni bina ketersediaan tinggi. 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