Rumah > Artikel > pembangunan bahagian belakang > Penyegerakan dan pengoptimuman prestasi dalam model konkurensi Golang
Penyegerakan dan pengoptimuman prestasi dalam model serentak Golang
Pengenalan:
Dengan perkembangan berterusan teknologi komputer dan populariti pemproses berbilang teras, cara menggunakan sumber berbilang teras dengan berkesan dan meningkatkan prestasi program telah menjadi isu penting dalam subjek pembangunan perisian. Sebagai bahasa pengaturcaraan serentak, Golang menyediakan banyak primitif dan perpustakaan serentak, membolehkan pengaturcara memanfaatkan sepenuhnya pemproses berbilang teras dan mengurangkan kerumitan pengaturcaraan serentak. Artikel ini akan memperkenalkan mekanisme penyegerakan dan kaedah pengoptimuman prestasi dalam model serentak Golang dan memberikan contoh kod khusus.
1. Mekanisme penyegerakan
import "sync" var mu sync.Mutex var balance int func Deposit(amount int) { mu.Lock() defer mu.Unlock() balance += amount } func main() { wg := sync.WaitGroup{} for i := 0; i < 1000; i++ { wg.Add(1) go func() { Deposit(100) wg.Done() }() } wg.Wait() fmt.Println(balance) }
import "sync" var ( mu sync.Mutex deposit = 0 cond = sync.NewCond(&mu) ) func Deposit(amount int) { mu.Lock() defer mu.Unlock() deposit += amount cond.Signal() // 通知等待的线程 } func Withdraw(amount int) { mu.Lock() defer mu.Unlock() for deposit < amount { // 判断条件是否满足 cond.Wait() // 等待条件变量的信号 } deposit -= amount } func main() { go Deposit(100) go Withdraw(100) }
import "sync" var ( sem = make(chan struct{}, 10) // 限制同时访问资源的线程数量为10 balance int ) func Deposit(amount int) { sem <- struct{}{} // 获取信号量 balance += amount <-sem // 释放信号量 } func main() { wg := sync.WaitGroup{} for i := 0; i < 1000; i++ { wg.Add(1) go func() { Deposit(100) wg.Done() }() } wg.Wait() fmt.Println(balance) }
func ParallelProcess(data []int) { c := make(chan int) for i := 0; i < len(data); i++ { go func(d int) { result := Process(d) c <- result }(data[i]) } for i := 0; i < len(data); i++ { <-c } }
func BatchProcess(data []int) { wg := sync.WaitGroup{} for i := 0; i < len(data); i++ { wg.Add(1) go func(d int) { Process(d) wg.Done() }(data[i]) } wg.Wait() }
Dokumentasi rasmi Golang: https://golang.org/
Golang concurrency: https://go.dev/blog/concurrency-is-not-parallelism
Atas ialah kandungan terperinci Penyegerakan dan pengoptimuman prestasi dalam model konkurensi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!