Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penyegerakan dan pengoptimuman prestasi dalam model konkurensi Golang

Penyegerakan dan pengoptimuman prestasi dalam model konkurensi Golang

WBOY
WBOYasal
2023-09-29 13:12:312198semak imbas

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

  1. Mutex (Mutex)
    Mutex (Mutex) ialah salah satu mekanisme penyegerakan paling asas di Golang. Melalui operasi mengunci dan membuka kunci mutex, ia boleh dipastikan bahawa hanya satu utas boleh melaksanakan kod bahagian kritikal yang dilindungi pada masa yang sama, dengan itu mengelakkan keadaan perlumbaan dan persaingan data antara berbilang utas. .
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)
}
  1. Semaphore
    Semaphore ialah mekanisme yang digunakan untuk mengawal akses kepada sumber yang dikongsi Ia boleh mengehadkan bilangan utas yang boleh mengakses sumber pada masa yang sama.
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)
}
    2. Kaedah pengoptimuman prestasi

  1. Parallelization
Parallelization ialah kaedah untuk meningkatkan prestasi program dengan melaksanakan pelbagai tugas pada masa yang sama. Di Golang, paralelisasi boleh dicapai dengan menggabungkan goroutine dan saluran.

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)
}
  1. Pemprosesan kelompok
    Pemprosesan kelompok ialah kaedah menggabungkan beberapa tugas kecil menjadi satu tugas besar untuk meningkatkan prestasi program. Di Golang, pemprosesan kelompok boleh dilaksanakan melalui WaitGroup dalam pakej penyegerakan.
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
    }
}
  1. Pengaturcaraan tanpa kunci
    Pengaturcaraan tanpa kunci ialah kaedah untuk meningkatkan prestasi program dengan mengelakkan penggunaan kunci mutex. Di Golang, anda boleh menggunakan operasi atom dan operasi CAS (Compare And Swap) untuk mencapai pengaturcaraan tanpa kunci.
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()
}
    Kesimpulan:
  1. Golang menyediakan primitif serentak yang kaya dan perpustakaan yang membolehkan pengaturcara memanfaatkan sepenuhnya pemproses berbilang teras dan mengurangkan kerumitan pengaturcaraan serentak. Dengan memilih dan menggunakan mekanisme penyegerakan dan kaedah pengoptimuman prestasi secara rasional, kami boleh meningkatkan prestasi serentak dan responsif program. Walau bagaimanapun, adalah perlu untuk menimbang hubungan antara penyegerakan dan prestasi berdasarkan senario dan keperluan aplikasi tertentu, dan memilih kaedah dan alat yang paling sesuai untuk menyelesaikan masalah.
  2. Rujukan:


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!

    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