有没有办法使用消息来模拟共享状态?
Is there a way to model shared state using messages?
所以目前我在编写 "correct" golang 时遇到了一个非常现实的问题。我有一个对象(为了简单起见,让我们把它想象成一个 map[string]string),我希望它在多个 gortuines 之间保持 "shared" 状态。
目前的实现是这样的:
//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 标准,这是一个非常丑陋的实现,它鼓励使用消息对并发进行建模。
是否有使用我明显不知道的消息对共享状态进行建模的简单方法?还是在这种情况下我被迫使用互斥体?
您不 "model shared state using messages",您使用消息 而不是 共享状态,这需要根据不同的基础设计应用程序。一般不是把mutex改写成channel的问题,而是完全不同的实现方式,而且这种方式不会适用于所有需要同步操作的场景。如果共享地图是最适合您情况的方法,那么互斥锁是同步访问它的正确方法。
以我自己的经验为例,我开发了允许在运行时更改其配置的应用程序。我没有共享 Config 对象并同步访问它,而是为每个主 goroutine 提供一个通道,它可以在该通道上接收配置更新。当配置更改时,更新将发送到所有侦听器。当侦听器获得配置更改时,它可以完成其当前操作,然后以适合该例程的任何方式处理配置更改 - 它可能只是更新其配置的本地副本,它可能关闭与外部资源的连接并打开新的等等。我发送和接收事件而不是共享数据,这是一个根本不同的设计。
所以目前我在编写 "correct" golang 时遇到了一个非常现实的问题。我有一个对象(为了简单起见,让我们把它想象成一个 map[string]string),我希望它在多个 gortuines 之间保持 "shared" 状态。
目前的实现是这样的:
//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 标准,这是一个非常丑陋的实现,它鼓励使用消息对并发进行建模。
是否有使用我明显不知道的消息对共享状态进行建模的简单方法?还是在这种情况下我被迫使用互斥体?
您不 "model shared state using messages",您使用消息 而不是 共享状态,这需要根据不同的基础设计应用程序。一般不是把mutex改写成channel的问题,而是完全不同的实现方式,而且这种方式不会适用于所有需要同步操作的场景。如果共享地图是最适合您情况的方法,那么互斥锁是同步访问它的正确方法。
以我自己的经验为例,我开发了允许在运行时更改其配置的应用程序。我没有共享 Config 对象并同步访问它,而是为每个主 goroutine 提供一个通道,它可以在该通道上接收配置更新。当配置更改时,更新将发送到所有侦听器。当侦听器获得配置更改时,它可以完成其当前操作,然后以适合该例程的任何方式处理配置更改 - 它可能只是更新其配置的本地副本,它可能关闭与外部资源的连接并打开新的等等。我发送和接收事件而不是共享数据,这是一个根本不同的设计。