所以目前我在编写“正确的”golang方面遇到了一个非常现实的问题。我有一个对象(为了简单起见,我们把它想象成一个map [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标准实现这项工作,但这种标准鼓励使用消息建模并发。
是否有简单的方法使用我公然不知道的消息来建模共享状态?或者我在这种情况下被迫使用互斥量?
答案 0 :(得分:2)
您没有“使用消息建模共享状态”,您使用消息而不是共享状态,这需要根据不同的基础设计应用程序。通常不是将互斥锁重写为通道,而是完全不同的实现方法,并且该方法不适用于需要同步操作的所有场景。如果共享地图是适合您情况的最佳方法,那么互斥锁是同步访问权限的正确方法。
根据我自己的经验,我开发了一些应用程序,允许在运行时更改其配置。我没有拥有共享的Config对象并同步对它的访问,而是给每个主要的goroutine一个可以接收配置更新的通道。配置更改时,更新将发送给所有侦听器。当侦听器获得配置更改时,它可以完成当前操作,然后以适合该例程的任何方式处理配置更改 - 它可能只是更新其配置的本地副本,它可能会关闭与外部资源的连接并打开我不是共享数据,而是发送和接收事件,这是一种根本不同的设计。