Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah kaedah penyegerakan golang?

Apakah kaedah penyegerakan golang?

PHPz
PHPzasal
2023-03-31 10:26:11792semak imbas

Dengan pengemaskinian dan pembangunan teknologi komputer yang berterusan, bahasa pengaturcaraan juga sentiasa dikemas kini dan berkembang. Satu ciri penting bahasa pengaturcaraan adalah untuk menyokong pelaksanaan serentak beberapa utas. Semasa pelaksanaan serentak berbilang utas, mudah bagi utas yang berbeza untuk mengganggu satu sama lain atau mengakses sumber yang sama pada masa yang sama Dalam kes ini, kaedah penyegerakan perlu digunakan untuk menyelesaikan masalah.

Golang ialah bahasa pengaturcaraan yang menyokong penyelarasan berbilang benang. Ramai pengaturcara Golang menggunakan kaedah penyegerakan untuk menyelesaikan masalah akses serentak. Artikel ini akan membawa pembaca memahami penggunaan kaedah penyegerakan Golang.

Pengenalan kepada kaedah penyegerakan

Di Golang, menggunakan kaedah penyegerakan boleh memastikan penyegerakan data antara coroutine yang berbeza dan keselamatan capaian data antara berbilang coroutine. Dengan menggunakan kaedah penyegerakan, pengaturcara boleh mengelakkan konflik capaian data apabila berbilang coroutine dilaksanakan secara serentak. Di Golang, terdapat banyak cara untuk melaksanakan kaedah penyegerakan, termasuk kunci mutex, kunci rwmutex, saluran, dll.

mutex lock

mutex lock ialah kaedah penyegerakan paling asas di Golang Ia menyediakan kaedah penyegerakan data yang paling asas. Penggunaan kunci mutex adalah sangat mudah Anda hanya perlu menambah kunci mutex sebelum coroutine untuk mencapai tujuan penyegerakan coroutine. Berikut ialah contoh kod menggunakan kunci mutex:

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    lock sync.Mutex
)

func increment() {
    lock.Lock()
    count++
    lock.Unlock()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    fmt.Println(count)
}

Dalam kod di atas, kami menggunakan penyegerakan.Mutex untuk melaksanakan penyegerakan coroutine. Dalam fungsi kenaikan, kami menggunakan kunci.Kunci dan kunci.Buka kunci untuk mengunci kiraan, memastikan bahawa apabila berbilang akses coroutine mengira, hanya satu coroutine boleh mengaksesnya, mengelakkan konflik data yang disebabkan oleh akses serentak. Dalam fungsi utama, kami membuka 1000 coroutine untuk memanggil fungsi kenaikan dan akhirnya mengeluarkan nilai kiraan.

kunci rwmutex

Walaupun kunci mutex boleh menyelesaikan masalah konflik akses serentak, dalam sesetengah senario, ia perlu menyokong kedua-dua operasi baca dan operasi tulis. Pada masa ini, anda perlu menggunakan kunci rwmutex. Kunci rwmutex di Golang ialah kunci baca-tulis, yang membahagikan kunci kepada dua jenis: kunci baca dan kunci tulis. Kunci baca boleh dipegang oleh berbilang coroutine pada masa yang sama, tetapi apabila kunci tulis dipegang, kunci baca tidak boleh diperoleh, iaitu kunci tulis mempunyai keutamaan yang lebih tinggi daripada kunci baca.

Berikut ialah contoh kod menggunakan kunci rwmutex:

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    lock sync.RWMutex
)

func read() {
    lock.RLock()
    defer lock.RUnlock()
    fmt.Println(count)
}

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

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            read()
        }()
    }

    wg.Add(1)
    go func() {
        defer wg.Done()
        write()
    }()
    wg.Wait()
}

Dalam kod di atas, kami mentakrifkan pembolehubah kiraan dan penyegerakan.RWMutex, menggunakan fungsi baca dan tulis untuk membaca dan tulis pembolehubah kiraan. Apabila fungsi baca dipanggil, kami menggunakan lock.RLock untuk mendapatkan kunci baca supaya berbilang coroutine boleh membaca nilai pembolehubah kiraan pada masa yang sama. Apabila fungsi tulis dipanggil, kami menggunakan kunci.Kunci untuk mendapatkan kunci tulis supaya hanya satu coroutine boleh menulis nilai pembolehubah kiraan. Dalam fungsi utama, kami membuka 10 coroutine untuk memanggil fungsi baca, dan satu coroutine untuk memanggil fungsi tulis.

saluran

Selain kunci mutex dan kunci rwmutex, terdapat satu lagi kaedah penyegerakan di Golang, iaitu saluran. Saluran boleh digunakan untuk memindahkan data antara coroutine dan menyegerakkan susunan pelaksanaan coroutine. Terdapat tiga jenis saluran: saluran tidak buffer, saluran buffer dan saluran arah.

Berikut ialah contoh kod untuk menggunakan saluran tanpa cache:

package main

import (
    "fmt"
)

func main() {
    c := make(chan int, 1)
    go func() {
        c <- 1
    }()
    fmt.Println(<-c)
}

Dalam kod di atas, kami menggunakan fungsi make untuk mencipta saluran tanpa cache dan menentukan coroutine ke dan dari saluran memindahkan data masuk. Dalam fungsi utama, kami membaca data dalam saluran melalui pernyataan "<-c".

Ciri saluran tanpa penimbal ialah penghantaran dan penerimaan adalah segerak, iaitu dua coroutine mesti bersedia pada masa yang sama sebelum menghantar dan menerima operasi, jika tidak, kebuntuan akan berlaku.

Terdapat perbezaan antara saluran cache dan saluran bukan cache Saluran cache boleh menyimpan berbilang elemen pada masa yang sama Saiz penimbal ialah saiz yang dimulakan apabila saluran dibuat. Apabila menggunakan saluran cache, operasi penghantaran hanya akan menyekat apabila penimbal penuh, dan operasi menerima hanya akan menyekat apabila penimbal kosong.

Saluran dengan arah boleh digunakan untuk mengawal arah baca dan tulis saluran, contohnya, ia hanya boleh digunakan untuk menulis data atau hanya boleh digunakan untuk membaca data.

Kesimpulan

Kaedah penyegerakan Golang termasuk kunci mutex, kunci rwmutex dan saluran. Dengan menggunakan kaedah penyegerakan ini, anda boleh memastikan bahawa tidak akan ada konflik capaian data apabila berbilang coroutine dilaksanakan secara serentak. Dalam pembangunan sebenar, pengaturcara perlu memilih kaedah penyegerakan yang berbeza berdasarkan senario sebenar untuk mencapai prestasi dan kebolehpercayaan yang optimum.

Atas ialah kandungan terperinci Apakah kaedah penyegerakan 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