동시성이 높은 시나리오에서 함수 캐시를 사용하면 반복 계산을 피할 수 있으며 잠금 메커니즘을 도입하면 캐시된 데이터의 동시성 안전성을 보장할 수 있습니다. 캐싱은 sync.Map을 통해 Go 언어로 구현할 수 있으며, 동시성 안전성을 달성하기 위해 각 캐시 항목에 뮤텍스 잠금이 도입됩니다. 실제 사례에서는 피보나치 수열의 계산 결과를 효율적으로 캐시하기 위해 캐시 및 잠금 메커니즘이 사용됩니다.
Go 언어에서 동시 함수의 캐시 잠금 메커니즘 탐색
머리말
동시성이 높은 시나리오에서는 함수의 반복 계산을 피하기 위해 캐시 메커니즘을 사용할 수 있습니다. 캐시된 데이터의 동시성 보안을 보장하려면 잠금 메커니즘을 도입해야 합니다. 이 기사에서는 Go 언어의 함수 캐시 잠금 구현에 대해 논의하고 실제 사례를 통해 이를 보여줍니다.
캐시 구현
함수 캐싱을 구현하는 가장 간단한 방법은 효율적이고 스레드로부터 안전한 키-값 매핑 기능을 제공하는 sync.Map
유형을 사용하는 것입니다.
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) }
잠금 메커니즘
캐시된 데이터의 동시성 안전성을 보장하기 위해 각 캐시 항목에 대해 뮤텍스 잠금을 도입할 수 있습니다.
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) }
실용 사례
다음은 피보나치 수열의 계산 결과를 캐시하는 방법을 보여주는 캐시 및 잠금 메커니즘을 사용하는 간단한 예입니다.
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) } }
Running results
0 1 1 2 3 5 8 13 21 34
이 예에서 동시 고루틴은 피보나치 수열을 동시에 계산하고, 계산 결과를 올바르게 캐시하여 반복 계산을 방지합니다.
위 내용은 golang 동시 기능 캐시 잠금 메커니즘 연구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!