いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-353 (sync.OnceValues)(go 1.21から追加)

関連記事

GitHub - devlights/blog-summary: ブログ「いろいろ備忘録日記」のまとめ

概要

以下、自分用のメモです。忘れない内にメモメモ。。。

Go 1.21 から、syncパッケージに OnceValues って関数が追加されていたのですね。知らなかったです。

https://pkg.go.dev/sync@go1.21.4#OnceValues

元々存在していた sync.Once が使いやすくなった感じですね。動きとしては同じで1度だけ実行される関数にしてくれます。

サンプル

package syncs

import (
    "runtime"
    "sync"

    "github.com/devlights/gomy/output"
)

// UseOnceValues は、Go 1.21 で追加された sync.OnceValues() のサンプルです。
//
// # REFERENCES
//   - https://pkg.go.dev/sync@go1.21.4#OnceValues
func UseOnceValues() error {
    var (
        v = 0
        f = sync.OnceValues(func() (int, error) {
            v++
            return v, nil
        })
    )
    output.Stdoutl("[before]", v)

    var (
        numCpu = runtime.NumCPU()
        done   = make(chan bool, numCpu)
    )
    for i := 0; i < numCpu; i++ {
        i := i
        go func() {
            result, err := f()
            output.Stderrf("[done]", "result=%d\terr=%v\tgoroutine-%d\n", result, err, i)
            done <- true
        }()
    }

    for i := 0; i < numCpu; i++ {
        <-done
    }

    output.Stdoutl("[after]", v)

    return nil

    /*
       $ task
       task: Task "build" is up to date
       task: [run] ./try-golang -onetime

       ENTER EXAMPLE NAME: syncs_use_oncevalues

       [Name] "syncs_use_oncevalues"
       [before]             0
       [done]               result=1   err=<nil>       goroutine-15
       [done]               result=1   err=<nil>       goroutine-13
       [done]               result=1   err=<nil>       goroutine-14
       [done]               result=1   err=<nil>       goroutine-10
       [done]               result=1   err=<nil>       goroutine-1
       [done]               result=1   err=<nil>       goroutine-0
       [done]               result=1   err=<nil>       goroutine-2
       [done]               result=1   err=<nil>       goroutine-6
       [done]               result=1   err=<nil>       goroutine-5
       [done]               result=1   err=<nil>       goroutine-11
       [done]               result=1   err=<nil>       goroutine-3
       [done]               result=1   err=<nil>       goroutine-8
       [done]               result=1   err=<nil>       goroutine-9
       [done]               result=1   err=<nil>       goroutine-7
       [done]               result=1   err=<nil>       goroutine-4
       [done]               result=1   err=<nil>       goroutine-12
       [after]              1


       [Elapsed] 460.969µs
   */
}

実行すると以下のようになります。

$ task
task: Task "build" is up to date
task: [run] ./try-golang -onetime

ENTER EXAMPLE NAME: syncs_use_oncevalues

[Name] "syncs_use_oncevalues"
[before]             0
[done]               result=1   err=<nil>       goroutine-15
[done]               result=1   err=<nil>       goroutine-11
[done]               result=1   err=<nil>       goroutine-12
[done]               result=1   err=<nil>       goroutine-4
[done]               result=1   err=<nil>       goroutine-3
[done]               result=1   err=<nil>       goroutine-5
[done]               result=1   err=<nil>       goroutine-13
[done]               result=1   err=<nil>       goroutine-14
[done]               result=1   err=<nil>       goroutine-0
[done]               result=1   err=<nil>       goroutine-6
[done]               result=1   err=<nil>       goroutine-8
[done]               result=1   err=<nil>       goroutine-7
[done]               result=1   err=<nil>       goroutine-1
[done]               result=1   err=<nil>       goroutine-9
[done]               result=1   err=<nil>       goroutine-2
[done]               result=1   err=<nil>       goroutine-10
[after]              1


[Elapsed] 502.8µs

参考情報

sync: add OnceFunc, OnceValue, OnceValues · Issue #56102 · golang/go · GitHub

New functions to support sync.Once | by Pranoy Kundu | Oct, 2023 | Medium

Goのおすすめ書籍

Go言語による並行処理

Go言語による並行処理

Amazon


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。