Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Jenis dan penggunaan kunci dalam fungsi Golang pengaturcaraan serentak

Jenis dan penggunaan kunci dalam fungsi Golang pengaturcaraan serentak

WBOY
WBOYasal
2024-04-18 08:12:02464semak imbas

Go menyediakan tiga jenis kunci dalam pengaturcaraan serentak berfungsi: mutex (Mutex), kunci baca-tulis (RWMutex) dan kunci sekali (Sekali). Kunci Mutex menjamin akses eksklusif, kunci baca-tulis membenarkan bacaan serentak dan tulis tunggal, dan kunci sekali memastikan bahawa blok kod dilaksanakan sekali sahaja. Kunci ini digunakan untuk menyelaraskan akses kepada sumber yang dikongsi dan menghalang perlumbaan data. Dalam amalan, mutexes memastikan konsistensi data dalam perkhidmatan web serentak, menghalang permintaan serentak daripada mengubah suai struktur data yang dikongsi secara serentak.

Jenis dan penggunaan kunci dalam fungsi Golang pengaturcaraan serentak

Jenis dan penggunaan kunci dalam pengaturcaraan serentak berfungsi Go

Dalam pengaturcaraan serentak berfungsi Go, kunci ialah mekanisme penyegerakan yang digunakan untuk menyelaraskan akses kepada sumber dikongsi dan menghalang persaingan data. Go menyediakan berbilang jenis kunci, setiap satu dengan ciri yang berbeza dan senario yang berkenaan.

Mutex lock

Mutex ialah kunci asas yang hanya boleh membenarkan satu goroutine mendapatkan sumber pada masa yang sama. Ia menjamin akses eksklusif kepada sumber yang dikongsi.

import (
    "sync"
    "fmt"
)

var (
    mu      sync.Mutex
    counter int
)

func main() {
    for i := 0; i < 1000; i++ {
        go func() {
            mu.Lock()
            counter++
            mu.Unlock()
        }()
    }
    fmt.Println("Final counter value:", counter)
}

Kunci baca-tulis

Kunci baca-tulis (RWMutex) membenarkan berbilang goroutin membaca sumber yang dikongsi secara serentak, tetapi hanya satu goroutine boleh menulis sumber pada masa yang sama.

import (
    "sync"
    "fmt"
)

var (
    rwmu  sync.RWMutex
    shared []int
)

func main() {
    // 多个 goroutine 并发读取共享切片
    for i := 0; i < 1000; i++ {
        go func() {
            rwmu.RLock()
            fmt.Println("Read:", shared)
            rwmu.RUnlock()
        }()
    }

    // 单独的 goroutine 写入共享切片
    go func() {
        rwmu.Lock()
        shared = append(shared, 1, 2, 3)
        rwmu.Unlock()
    }()
}

Once

Once ialah kunci sekali digunakan untuk memastikan blok kod tertentu dilaksanakan sekali sahaja.

import (
    "sync"
    "fmt"
)

var (
    initOnce sync.Once
    inited   = false
)

func initialize() {
    inited = true
    fmt.Println("Initialized")
}

func main() {
    initOnce.Do(initialize)
    if inited {
        fmt.Println("Already initialized")
    } else {
        fmt.Println("Not initialized")
    }
}

Kes praktikal: memastikan ketekalan data dalam perkhidmatan web serentak

Andaikan terdapat perkhidmatan web di mana berbilang permintaan serentak perlu beroperasi pada struktur data kongsi yang sama. Untuk memastikan ketekalan data, kunci mutex boleh digunakan untuk melindungi struktur data dan menghalang permintaan serentak daripada mengubah suai pada masa yang sama.

import (
    "sync"
    "net/http"
)

var (
    mu      sync.Mutex
    clients map[string]*http.Client
)

func main() {
    http.HandleFunc("/addClient", func(w http.ResponseWriter, r *http.Request) {
        mu.Lock()
        clients[r.FormValue("name")] = &http.Client{}
        mu.Unlock()
    })
}

Dalam contoh ini, menggunakan mutex mu 保护对 clients akses serentak ke peta memastikan hanya satu permintaan boleh menambah atau mengubah suai maklumat pelanggan pada masa yang sama, sekali gus mengelakkan perlumbaan data.

Atas ialah kandungan terperinci Jenis dan penggunaan kunci dalam fungsi Golang pengaturcaraan serentak. 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