Heim  >  Artikel  >  Backend-Entwicklung  >  Forschung zum Golang-Cache-Sperrmechanismus für gleichzeitige Funktionen

Forschung zum Golang-Cache-Sperrmechanismus für gleichzeitige Funktionen

WBOY
WBOYOriginal
2024-04-30 18:18:02753Durchsuche

In Szenarien mit hoher Parallelität kann die Verwendung des Funktionscaches wiederholte Berechnungen vermeiden, und die Einführung eines Sperrmechanismus kann die Parallelitätssicherheit zwischengespeicherter Daten gewährleisten. Caching kann über sync.Map in der Go-Sprache implementiert werden, und für jedes Cache-Element wird eine Mutex-Sperre eingeführt, um Parallelitätssicherheit zu gewährleisten. In einem praktischen Fall werden der Cache- und der Sperrmechanismus verwendet, um die Berechnungsergebnisse der Fibonacci-Folge effizient zwischenzuspeichern.

Forschung zum Golang-Cache-Sperrmechanismus für gleichzeitige Funktionen

Erkunden des Cache-Sperrmechanismus gleichzeitiger Funktionen in der Go-Sprache

Vorwort
In Szenarien mit hoher Parallelität können Sie den Cache-Mechanismus verwenden, um wiederholte Berechnungen von Funktionen zu vermeiden. Um die Parallelitätssicherheit zwischengespeicherter Daten zu gewährleisten, muss ein Sperrmechanismus eingeführt werden. In diesem Artikel wird die Implementierung der Funktions-Cache-Sperre in der Go-Sprache erläutert und anhand praktischer Fälle demonstriert.

Cache-Implementierung
Der einfachste Weg, Funktions-Caching zu implementieren, ist die Verwendung des Typs sync.Map, der effiziente und threadsichere Schlüsselwert-Zuordnungsfunktionen bereitstellt.

import "sync"

type Cache struct {
    sync.Map
}

func (c *Cache) Get(key string) (interface{}, bool) {
    return c.Load(key)
}

func (c *Cache) Set(key string, value interface{}) {
    c.Store(key, value)
}

Sperrmechanismus
Um die Parallelitätssicherheit zwischengespeicherter Daten zu gewährleisten, kann für jedes Cache-Element eine Mutex-Sperre eingeführt werden.

type CacheWithLock struct {
    sync.Map
    locks map[string]*sync.Mutex
}

func (c *CacheWithLock) Get(key string) (interface{}, bool) {
    c.locks[key].Lock()
    defer c.locks[key].Unlock()
    return c.Load(key)
}

func (c *CacheWithLock) Set(key string, value interface{}) {
    c.locks[key].Lock()
    defer c.locks[key].Unlock()
    c.Store(key, value)
}

Praktischer Fall
Das Folgende ist ein einfaches Beispiel mit dem Cache- und Sperrmechanismus, das zeigt, wie die Berechnungsergebnisse der Fibonacci-Sequenz zwischengespeichert werden.

package main

import (
    "fmt"
    "sync"
)

var cache *CacheWithLock
var fibFuncs = map[int]func(n int) int{}

func init() {
    cache = &CacheWithLock{
        Map:   make(sync.Map),
        locks: make(map[string]*sync.Mutex),
    }
    fibFuncs[0] = func(n int) int { return 0 }
    fibFuncs[1] = func(n int) int { return 1 }
}

func fib(n int) int {
    f, ok := fibFuncs[n]
    if ok {
        return f(n)
    }
    fibFuncs[n] = func(n int) int {
        return fib(n-1) + fib(n-2)
    }
    return fib(n)
}

func main() {
    for i := 0; i < 10; i++ {
        go func(n int) {
            fmt.Println(cache.Get(n))
            cache.Set(n, fib(n))
        }(i)
    }
}

Laufende Ergebnisse

0
1
1
2
3
5
8
13
21
34

In diesem Beispiel berechnet die gleichzeitige Goroutine gleichzeitig die Fibonacci-Folge und speichert die Berechnungsergebnisse korrekt zwischen, um wiederholte Berechnungen zu vermeiden.

Das obige ist der detaillierte Inhalt vonForschung zum Golang-Cache-Sperrmechanismus für gleichzeitige Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn