ホームページ  >  記事  >  バックエンド開発  >  golangの並列関数キャッシュロック機構の研究

golangの並列関数キャッシュロック機構の研究

WBOY
WBOYオリジナル
2024-04-30 18:18:02755ブラウズ

同時実行性の高いシナリオでは、関数キャッシュを使用すると計算の繰り返しを回避でき、ロック メカニズムを導入することでキャッシュされたデータの同時実行性のセキュリティを確保できます。キャッシュは sync.Map を通じて Go 言語で実装でき、同時実行の安全性を達成するために各キャッシュ項目にミューテックス ロックが導入されます。実際のケースでは、キャッシュとロックのメカニズムを使用して、フィボナッチ数列の計算結果を効率的にキャッシュします。

golangの並列関数キャッシュロック機構の研究

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。