所以目前我在编写“正确的”golang 时遇到了一个非常现实的问题。我有一个对象(为了简单起见,我们将其视为一个 map[string]string),并且我希望它在多个 gortuines 之间保持“共享”状态。
目前的实现是这样的:
//Inside shared_state.go
var sharedMap map[string]string = make(map[string]string)
var mutex sync.RWMutex = sync.RWMutex{}
func Add(k string, v string) bool {
mutex.Lock()
if _, exists := sharedMap[k]; exists {
mutex.Unlock()
return false
}
tokenMap[k] = v
mutex.Unlock()
return true
}
//Other methods to access, modify... etc
虽然这确实完成了这项工作,但按照 go 标准,这是一个相当丑陋的实现,它鼓励使用消息来建模并发性。
是否有使用我明显不知道的消息来对共享状态进行建模的简单方法?或者在这种情况下我是否被迫使用互斥体?
最佳答案
您不是“使用消息对共享状态进行建模”,而是使用消息而不是共享状态,这需要基于不同的基础原理来设计应用程序。一般来说,这不是将互斥体重写为 channel 的问题,而是完全不同的实现方法,并且该方法并不适用于所有需要同步操作的场景。如果共享映射是适合您情况的最佳方法,那么互斥锁就是同步对其访问的正确方法。
作为我自己的经验的一个例子,我开发了允许在运行时更改其配置的应用程序。我不是拥有一个共享的 Config 对象并同步对其的访问,而是为每个主 goroutine 提供一个可以接收配置更新的 channel 。当配置更改时,更新会发送到所有监听器。当监听器获得配置更改时,它可以完成其当前操作,然后以适合该例程的任何方式处理配置更改 - 它可能只是更新其配置的本地副本,它可能会关闭与外部资源的连接并打开新的等等。我不是共享数据,而是发送和接收事件,这是一种根本不同的设计。
关于go - 有没有办法使用消息来模拟共享状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44294959/