标准库 rand.NewSource
函数的
文档指出,
与顶级函数使用的默认 Source 不同,此源是 多个 goroutine 并发使用不安全。
有没有办法创建线程安全的
rand.Source
?
上下文:我有一个类型,其方法可能被多个 go 例程调用,并且该方法使用随机数。我想支持依赖注入进行测试,所以不能使用默认的Source。
通常使用 sync.Mutex 来确保不会同时访问一个或多个值。以下是如何使用sync.Mutex来保护rand。来源:
var s = rand.NewSource(seed)
var mu sync.Mutex
// lock/unlock when accessing source from a goroutine
mu.Lock()
i := s.Int63()
mu.Unlock()
rand.Rand不支持并发使用。如果应用程序使用 rand.Source 创建 rand.Rand,则改为保护 rand.Rand:
var r = rand.New(rand.NewSource(seed))
var mu sync.Mutex
// lock/unlock when accessing the rand from a goroutine
mu.Lock()
i := r.Int()
mu.Unlock()
用于保护 rand 的互斥量。Rand 也会保护 rand.Source。