Perbandingan prestasi pakej Golang Sync dalam senario konkurensi tinggi

WBOY
Lepaskan: 2023-09-29 15:41:11
asal
1234 orang telah melayarinya

Golang Sync包在高并发场景下的性能对比

Perbandingan prestasi pakej Golang Sync dalam senario serentak tinggi

Pengenalan:
Dalam pembangunan perisian moden, prestasi dalam senario serentak tinggi ialah penunjuk ukuran penting. Sebagai bahasa pengaturcaraan yang cekap dan berkuasa dengan keupayaan serentak yang kukuh, pakej penyegerakan Golang dalam perpustakaan standard menyediakan banyak primitif serentak untuk memudahkan pembangun melaksanakan program selamat benang. Artikel ini akan meneroka kelebihan dan senario terpakai bagi pakej Golang Sync dengan membandingkan prestasi model serentak berbeza dalam senario serentak tinggi.

1. Pengenalan kepada pakej Golang Sync
Pakej Golang Sync menyediakan banyak primitif serentak, termasuk mutex (Mutex), kunci baca-tulis (RWMutex), pembolehubah keadaan (Cond), kumpulan tunggu (WaitGroup), dll. Primitif ini Tujuan daripada bahasa itu adalah untuk membantu pembangun melaksanakan program selamat serentak. Primitif ini akan diperkenalkan secara ringkas di bawah:

  1. Mutex: Mutex digunakan untuk melindungi akses kepada sumber yang dikongsi, membenarkan hanya satu coroutine mengakses sumber yang dilindungi pada masa yang sama. Kunci Mutex menyokong dua operasi, Lock() dan Unlock(), yang pertama digunakan untuk memperoleh kunci, dan yang kedua digunakan untuk melepaskan kunci.
  2. Kunci baca-tulis (RWMutex): Kunci baca-tulis digunakan untuk memberikan prestasi yang lebih baik dalam senario dengan lebih banyak bacaan dan kurang penulisan Ia membenarkan berbilang coroutine membaca sumber yang dikongsi pada masa yang sama, tetapi hanya membenarkan satu coroutine untuk menulis sumber yang dikongsi. Kunci baca-tulis menyokong tiga operasi, iaitu RLock(), RUnlock() dan Lock() Dua yang pertama digunakan untuk memperoleh dan melepaskan kunci baca, dan yang terakhir digunakan untuk memperoleh dan melepaskan kunci tulis.
  3. Pembolehubah keadaan (Cond): Pembolehubah keadaan digunakan untuk menyelaraskan komunikasi dan penyegerakan antara coroutine Ia boleh dilaksanakan melalui menunggu dan pemberitahuan. Operasi menunggu menggunakan Wait(), dan coroutine yang menunggu boleh dimaklumkan untuk meneruskan pelaksanaan melalui Signal() atau Broadcast().
  4. WaitGroup: Kumpulan menunggu digunakan untuk menunggu selesainya kumpulan coroutine Pembangun boleh meningkatkan bilangan coroutine menunggu melalui Add() dan mengurangkan bilangan coroutine menunggu melalui Done(), manakala Wait() Digunakan untuk menunggu. untuk semua coroutine selesai.

2. Perbandingan model Concurrency

Dalam senario concurrency yang tinggi, model concurrency yang berbeza akan mempunyai prestasi yang berbeza. Di bawah, kami akan menggunakan kunci mutex, kunci baca-tulis dan kumpulan tunggu untuk melaksanakan akses serentak kepada sumber yang dikongsi dan membandingkan prestasi mereka melalui contoh kod tertentu.

  1. Contoh kunci mutex:
package main

import (
    "sync"
    "time"
)

var count int
var mutex sync.Mutex

func increment() {
    mutex.Lock()
    defer mutex.Unlock()
    count++
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    time.Sleep(time.Second)
    println("Count:", count)
}
Salin selepas log masuk
  1. Contoh kunci baca-tulis:
package main

import (
    "sync"
    "time"
)

var count int
var rwMutex sync.RWMutex

func read() {
    rwMutex.RLock()
    defer rwMutex.RUnlock()
    _ = count
}

func write() {
    rwMutex.Lock()
    defer rwMutex.Unlock()
    count++
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(2)
        go func() {
            defer wg.Done()
            read()
        }()
        go func() {
            defer wg.Done()
            write()
        }()
    }
    wg.Wait()
    time.Sleep(time.Second)
    println("Count:", count)
}
Salin selepas log masuk
  1. Contoh kumpulan menunggu:
package main

import (
    "sync"
    "time"
)

var count int

func increment(wg *sync.WaitGroup, mutex *sync.Mutex) {
    mutex.Lock()
    defer func() {
        mutex.Unlock()
        wg.Done()
    }()
    count++
}

func main() {
    var wg sync.WaitGroup
    var mutex sync.Mutex
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg, &mutex)
    }
    wg.Wait()
    time.Sleep(time.Second)
    println("Count:", count)
}
Salin selepas log masuk
kod di atas.

rrreee tinggi. senario konkurensi, masing-masing Prestasi tiga model konkurensi: kunci mutex, kunci baca-tulis dan kumpulan tunggu telah diuji. Keputusan ujian menunjukkan bahawa apabila bilangan coroutine adalah kecil, perbezaan prestasi antara ketiga-tiga model adalah kecil Namun, apabila bilangan coroutine meningkat, prestasi kunci baca-tulis adalah agak baik, manakala prestasi kunci mutex dan. kumpulan menunggu agak miskin.

Dalam aplikasi praktikal, kita perlu memilih model konkurensi yang paling sesuai mengikut senario tertentu. Kunci Mutex sesuai untuk senario dengan operasi baca dan tulis yang agak sedikit, manakala kunci baca-tulis sesuai untuk senario dengan lebih banyak operasi baca dan kurang operasi tulis. Kumpulan menunggu sesuai untuk senario di mana anda perlu menunggu sekumpulan coroutine selesai sebelum meneruskan pelaksanaan.

Ringkasnya, primitif serentak pakej Golang Sync menyediakan pembangun alat yang berkuasa untuk membantu kami melaksanakan program yang cekap dan selamat dari benang. Apabila memilih model konkurensi, kita harus membuat pertukaran dan pilihan berdasarkan keperluan senario tertentu untuk mencapai matlamat pengoptimuman prestasi.

Rujukan:

[1] Pakej Golang Sync: https://golang.org/pkg/sync/
[2] Dokumentasi RWMutex Golang: https://golang.org/pkg/ sync/#RWMutex
[3 ] Dokumentasi Golang WaitGroup: https://golang.org/pkg/ sync/#WaitGroup

Atas ialah kandungan terperinci Perbandingan prestasi pakej Golang Sync dalam senario konkurensi tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan