Rumah > pembangunan bahagian belakang > Golang > Menggunakan teknologi penyegerakan Golang untuk mencapai keselarasan prestasi tinggi

Menggunakan teknologi penyegerakan Golang untuk mencapai keselarasan prestasi tinggi

WBOY
Lepaskan: 2023-09-28 16:42:29
asal
1099 orang telah melayarinya

Menggunakan teknologi penyegerakan Golang untuk mencapai keselarasan prestasi tinggi

Gunakan teknologi penyegerakan Golang untuk mencapai konkurensi berprestasi tinggi

Abstrak:
Golang adalah alat pemprosesan serentak yang sangat berkuasa bahasa pengaturcaraan yang menjadikannya agak mudah untuk menulis program serentak berprestasi tinggi melalui primitif penyegerakan terbina dalam dan mekanisme coroutine yang cekap. Artikel ini akan memperkenalkan teknologi penyegerakan biasa di Golang, termasuk kunci mutex, pembolehubah keadaan, kunci baca-tulis dan operasi atom serta memberikan contoh kod khusus.

Pengenalan:
Dalam era maklumat hari ini, kebanyakan aplikasi perlu mengendalikan sejumlah besar permintaan serentak. Untuk memastikan ketepatan dan prestasi program, adalah penting untuk mengendalikan konkurensi dengan betul. Sebagai bahasa pengaturcaraan yang mesra concurrency, Golang menyediakan beberapa teknologi penyegerakan yang sangat berguna yang boleh membantu kami melaksanakan program serentak berprestasi tinggi.

1. Mutex lock
Mutex lock ialah teknologi penyegerakan paling asas, yang boleh membantu kami mencapai akses yang saling eksklusif kepada pembolehubah dikongsi. Di Golang, kita boleh menggunakan pakej penyegerakan terbina dalam untuk melaksanakan kunci mutex. Berikut ialah contoh mudah:

package main

import (
    "fmt"
    "sync"
    "time"
)

var counter = 0
var mutex sync.Mutex

func increment() {
    mutex.Lock()
    counter++
    mutex.Unlock()
}

func main() {
    for i := 0; i < 1000; i++ {
        go increment()
    }

    time.Sleep(time.Second)

    fmt.Println("counter:", counter)
}
Salin selepas log masuk

Dalam kod di atas, kami menggunakan kunci mutex mutex untuk melindungi akses kepada pembolehubah kongsi counter . Dalam fungsi increment, kami mula-mula memanggil kaedah Lock untuk mendapatkan kunci mutex, kemudian naikkan counter dan akhirnya menggunakan Unlock Kaedah melepaskan kunci mutex. Dalam fungsi utama, kami memulakan 1000 goroutine untuk menambah counter pada masa yang sama, dan akhirnya mengeluarkan nilai counter. mutex来保护共享变量counter的访问。在increment函数中,我们首先调用Lock方法获取互斥锁,然后对counter进行自增操作,最后使用Unlock方法释放互斥锁。在main函数中,我们启动了1000个goroutine来同时对counter进行自增操作,最后输出counter的值。

二、条件变量
条件变量是一种允许goroutine等待或唤醒的同步机制。在Golang中,我们可以使用内置的sync包来实现条件变量。下面是一个简单的示例:

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    counter = 0
    cond    = sync.NewCond(&sync.Mutex{})
)

func increment() {
    cond.L.Lock()
    counter++
    cond.Signal()
    cond.L.Unlock()
}

func decrement() {
    cond.L.Lock()
    for counter == 0 {
        cond.Wait()
    }
    counter--
    cond.L.Unlock()
}

func main() {
    for i := 0; i < 1000; i++ {
        go increment()
        go decrement()
    }

    time.Sleep(time.Second)

    fmt.Println("counter:", counter)
}
Salin selepas log masuk

在上面的代码中,我们使用一个条件变量cond和一个互斥锁mutex来实现对共享变量counter的安全访问。在increment函数中,我们首先获取互斥锁,然后对counter进行自增操作,最后调用Signal方法唤醒一个等待在cond上的goroutine。在decrement函数中,我们首先获取互斥锁,然后检查counter的值是否为0,如果是则调用Wait方法等待,直到被唤醒,然后对counter进行自减操作。在main函数中,我们同时启动了1000个incrementdecrement函数,并最后输出counter的值。

三、读写锁
读写锁是一种允许多个goroutine并发读取共享资源,但只允许单个goroutine写入共享资源的同步机制。在Golang中,我们可以使用内置的sync包来实现读写锁。下面是一个简单的示例:

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    counter = 0
    rwLock  = sync.RWMutex{}
)

func read() {
    rwLock.RLock()
    fmt.Println("counter:", counter)
    time.Sleep(time.Millisecond)
    rwLock.RUnlock()
}

func write() {
    rwLock.Lock()
    counter++
    time.Sleep(time.Millisecond)
    rwLock.Unlock()
}

func main() {
    for i := 0; i < 10; i++ {
        go read()
        go write()
    }

    time.Sleep(time.Second)
}
Salin selepas log masuk

在上面的代码中,我们使用一个读写锁rwLock来保护共享变量counter的访问。在read函数中,我们使用RLock方法获取读锁,然后输出counter的值,并调用RUnlock方法释放读锁。在write函数中,我们使用Lock方法获取写锁,然后对counter进行自增操作,并调用Unlock方法释放写锁。在main函数中,我们同时启动了10个readwrite函数。

四、原子操作
原子操作是一种无需互斥锁就可以实现对共享变量的原子操作的同步机制。在Golang中,我们可以使用内置的atomic包来实现原子操作。下面是一个简单的示例:

package main

import (
    "fmt"
    "sync/atomic"
    "time"
)

var counter int32

func increment() {
    atomic.AddInt32(&counter, 1)
}

func main() {
    for i := 0; i < 1000; i++ {
        go increment()
    }

    time.Sleep(time.Second)

    fmt.Println("counter:", atomic.LoadInt32(&counter))
}
Salin selepas log masuk

在上面的代码中,我们使用AddInt32函数对共享变量counter进行原子自增操作,并使用LoadInt32函数获取counter的值。在main函数中,我们同时启动了1000个increment函数,并最后输出counter

2. Pembolehubah keadaan

Pembolehubah keadaan ialah mekanisme penyegerakan yang membolehkan goroutine menunggu atau bangun. Di Golang, kita boleh menggunakan pakej penyegerakan terbina dalam untuk melaksanakan pembolehubah keadaan. Berikut ialah contoh mudah:
rrreee

Dalam kod di atas, kami menggunakan pembolehubah keadaan cond dan kunci mutex mutex untuk mencapai akses Selamat kepada pembolehubah kongsi counter. Dalam fungsi increment, kita mula-mula mendapatkan kunci mutex, kemudian naikkan counter, dan akhirnya memanggil kaedah Signal untuk membangunkan isyarat menunggu dalam cond. Dalam fungsi penurunan, kami mula-mula mendapatkan kunci mutex, dan kemudian semak sama ada nilai counter ialah 0. Jika ya, panggil Tunggu kaedah untuk menunggu sehingga ia dikejutkan, dan kemudian lakukan operasi pengurangan sendiri pada kaunter. Dalam fungsi main, kami memulakan 1000 fungsi increment dan deccrement pada masa yang sama, dan akhirnya mengeluarkan nilai counter kod> . <p></p>3. Kunci baca-tulis<ul>Kunci baca-tulis ialah mekanisme penyegerakan yang membolehkan berbilang goroutine membaca sumber yang dikongsi secara serentak, tetapi hanya membenarkan satu goroutine menulis kepada sumber yang dikongsi. Di Golang, kita boleh menggunakan pakej penyegerakan terbina dalam untuk melaksanakan kunci baca-tulis. Berikut ialah contoh mudah: <li>rrreee</li>Dalam kod di atas, kami menggunakan kunci baca-tulis <code>rwLock untuk melindungi akses kepada pembolehubah kongsi counter . Dalam fungsi read, kami menggunakan kaedah RLock untuk mendapatkan kunci baca, kemudian keluarkan nilai counter dan panggil RUnlock Kaedah melepaskan kunci baca. Dalam fungsi <code>tulis, kami menggunakan kaedah Lock untuk mendapatkan kunci tulis, kemudian naikkan counter dan panggil Unlock code > kaedah melepaskan kunci tulis. Dalam fungsi <code>utama, kami memulakan 10 fungsi read dan write pada masa yang sama.
  • 4. Operasi atom Operasi atom ialah mekanisme penyegerakan yang boleh mencapai operasi atom pada pembolehubah kongsi tanpa kunci mutex. Di Golang, kita boleh menggunakan pakej atom terbina dalam untuk melaksanakan operasi atom. Berikut ialah contoh mudah: #🎜🎜#rrreee#🎜🎜#Dalam kod di atas, kami menggunakan fungsi AddInt32 untuk melaksanakan operasi kenaikan atom pada pembolehubah kongsi counter, Dan gunakan fungsi LoadInt32 untuk mendapatkan nilai counter. Dalam fungsi main, kami memulakan 1000 fungsi increment pada masa yang sama, dan akhirnya mengeluarkan nilai counter. #🎜🎜##🎜🎜#Kesimpulan: #🎜🎜#Artikel ini memperkenalkan teknologi penyegerakan biasa di Golang, termasuk kunci mutex, pembolehubah keadaan, kunci baca-tulis dan operasi atom, serta memberikan contoh kod khusus untuk membantu pembaca memahami dan menggunakan dengan lebih baik teknik penyegerakan ini untuk melaksanakan program serentak berprestasi tinggi. Dalam pengaturcaraan sebenar, kita perlu memilih teknologi penyegerakan yang sesuai mengikut situasi tertentu dan menjalankan kawalan serentak yang munasabah untuk meningkatkan prestasi dan kestabilan program. #🎜🎜##🎜🎜# Rujukan: #🎜🎜##🎜🎜##🎜🎜#Go laman web bahasa Cina (https://studygolang.com/)#🎜🎜##🎜🎜#Go laman web rasmi (https: //golang.org/)#🎜🎜##🎜🎜#

    Atas ialah kandungan terperinci Menggunakan teknologi penyegerakan Golang untuk mencapai keselarasan prestasi 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