同時実行性の高いシナリオでは、関数キャッシュを使用すると計算の繰り返しを回避でき、ロック メカニズムを導入することでキャッシュされたデータの同時実行性のセキュリティを確保できます。キャッシュは 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) } }
実行結果
0 1 1 2 3 5 8 13 21 34
この例では、並行ゴルーチンはフィボナッチ数列を同時に計算し、計算の繰り返しを避けるために計算結果を正しくキャッシュします。
以上がgolangの並列関数キャッシュロック機構の研究の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。