Rumah > Artikel > pembangunan bahagian belakang > Idea pengoptimuman dan kaedah Goroutines dalam amalan pengaturcaraan serentak Golang
Idea dan kaedah pengoptimuman Goroutines di Golang amalan pengaturcaraan serentak
Pengenalan:
Dengan pembangunan berterusan perkakasan komputer, pemproses teras tunggal tidak lagi dapat memenuhi keperluan semasa untuk pemprosesan data berskala besar dan keperluan serentak. Oleh itu, pengaturcaraan serentak menjadi semakin penting. Sebagai bahasa yang menyokong pengaturcaraan serentak, Goroutine dan mekanisme saluran terbina dalam Golang menyediakan alat yang berkuasa untuk pengaturcaraan serentak. Walau bagaimanapun, disebabkan overhed pensuisan yang tinggi bagi Goroutines Golang, jika Goroutines digunakan tanpa pengoptimuman, ia akan menyebabkan kesesakan prestasi. Artikel ini akan meneroka idea dan kaedah pengoptimuman Goroutines di Golang.
1. Penggunaan asas Goroutines
Di Golang, anda boleh membuat Goroutine melalui kata kunci "go". Berikut ialah contoh mudah:
package main import ( "fmt" ) func main() { go hello() fmt.Println("main function") } func hello() { fmt.Println("Hello, Goroutine!") }
Dalam kod di atas, Goroutine dimulakan oleh go hello()
. Goroutine dilaksanakan selari dengan utas utama, jadi anda boleh melihat bahawa "Hello, Goroutine!" dan "fungsi utama" muncul secara berselang-seli dalam output.
2. Idea dan kaedah pengoptimuman Goroutines
Berikut ialah contoh kod:
package main import ( "fmt" "sync" ) func main() { var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done() for i := 0; i < 1000; i++ { fmt.Println("Goroutine1: ", i) } }() go func() { defer wg.Done() for i := 0; i < 1000; i++ { fmt.Println("Goroutine2: ", i) } }() wg.Wait() fmt.Println("main function") }
Dalam kod di atas, sync.WaitGroup digunakan untuk menunggu dua Goroutine selesai melaksanakan sebelum melaksanakan utas utama. Dengan menggabungkan tugasan ke dalam sebilangan kecil Goroutines dan menggunakan sync.WaitGroup untuk melaksanakannya secara serentak, bilangan penciptaan dan penukaran Goroutines boleh dikurangkan.
package main import ( "fmt" ) func main() { pool := make(chan bool, 10) // 创建一个容量为10的Goroutines池 for i := 0; i < 1000; i++ { pool <- true go func(n int) { defer func() { <-pool }() fmt.Println("Goroutine: ", n) }(i) } for i := 0; i < cap(pool); i++ { pool <- true } fmt.Println("main function") }
Dalam kod di atas, kolam Goroutines dengan kapasiti 10 dicipta. Selepas setiap Goroutine dilaksanakan, semaphore akan dikeluarkan melalui saluran, menunjukkan bahawa Goroutine tersedia. Dengan menggunakan semula Goroutines sedia ada, bilangan penciptaan dan pemusnahan Goroutines dapat dikurangkan.
package main import ( "fmt" ) func main() { tasks := make(chan int, 100) // 创建一个容量为100的任务通道 results := make(chan int, 100) // 创建一个容量为100的结果通道 go produceTasks(tasks) // 生成任务 for i := 0; i < 10; i++ { go consumeTasks(tasks, results) // 消费任务 } showResults(results) // 显示结果 fmt.Println("main function") } func produceTasks(tasks chan<- int) { for i := 0; i < 100; i++ { tasks <- i } close(tasks) } func consumeTasks(tasks <-chan int, results chan<- int) { for task := range tasks { results <- task * task } } func showResults(results <-chan int) { for result := range results { fmt.Println("Result: ", result) } }
Dalam kod di atas, 100 tugas dijana melalui fungsi produceTasks() dan dihantar ke saluran tugas, dan kemudian tugasan diperoleh daripada saluran tugas melalui Goroutines pengguna (consumeTasks() fungsi) dan Proses dan hantar keputusan ke saluran keputusan. Akhir sekali, semua keputusan dipaparkan dalam fungsi showResults(). Melalui pembahagian tugas dan komunikasi data, prestasi konkurensi dan kebolehbacaan kod boleh dipertingkatkan.
Ringkasan:
Pengaturcaraan serentak Golang adalah salah satu ciri pentingnya Melalui penggunaan munasabah Goroutines dan mekanisme saluran, pengaturcaraan serentak boleh dicapai dengan cekap. Artikel ini memperkenalkan penggunaan asas, idea pengoptimuman dan kaedah Goroutines, termasuk mengurangkan bilangan penciptaan dan masa penukaran Goroutines, menggunakan kumpulan Goroutines dan pembahagian tugas serta kaedah komunikasi data. Saya harap ia akan membantu pembangun lebih memahami dan menggunakan pengaturcaraan serentak Golang.
Atas ialah kandungan terperinci Idea pengoptimuman dan kaedah Goroutines dalam amalan pengaturcaraan serentak Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!