go - 有没有办法使用消息来模拟共享状态?

标签 go concurrency channel coroutine goroutine

所以目前我在编写“正确的”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/

相关文章:

google-app-engine - Google 应用引擎 + Go + 数据存储 + 添加/更新/删除记录

php - PHP 中的多线程/并行处理

javascript - 这个javascript中有竞争条件吗?

go - 关闭未知长度的 channel

java - 在 RabbitMQ Java 客户端中每次发布时打开和关闭 Channel

javascript - JavaScript 中的 expressionengine channel 条目标签

parsing - Go - 包 ast : find package in file

docker - 无法在 Raspberry Pi 上运行 elasticsearch 镜像

java - Java 线程在没有 GC 干扰且机器负载较低的情况下会出现大量睡过头的情况

go - 无法组装交易,err 提案响应未成功,错误代码 500,msg 链码注册失败 : container exited with 0