【发布时间】:2018-10-14 04:05:24
【问题描述】:
我正在尝试在 golang 中创建消息中心。消息通过map[uint32]chan []float64 中持续存在的不同渠道传递。我在地图上进行无限循环并检查频道是否有消息。如果有,我将它与传入通道的 ID 一起写入公共客户端的写入通道。它工作正常,但使用所有 CPU,并且其他进程受到限制。
UPD:地图中的项目由另一个函数动态添加和删除。
我想通过 Docker 限制这个应用程序的 CPU,但也许有更优雅的路径?
我的代码:
func (c *Client) accumHandler() {
for !c.stop {
c.channels.Range(func(key, value interface{}) bool {
select {
case message := <-value.(chan []float64):
mess := map[uint32]interface{}{key.(uint32): message}
select {
case c.send <- mess:
}
default:
}
return !c.stop
})
}
}
【问题讨论】:
-
如果你有 100% 的 cpu 使用率而没有消息,那么你在某处有一个繁忙的循环。 “channel.Range()”有什么作用?为什么你有一个带有 1 个案例的选择?您的停止条件看起来很可疑,并且可能很不正常。你能创建一个minimal reproducible example吗?
-
好吧,我的繁忙循环是
case message := <-value.(chan []float64):,我想我能用它做什么,channel.Range 是一个库函数,供sync.Map迭代项目,选择 case-default 是用于非阻塞阅读的 go 模式。我将尝试创建小示例并更新问题。
标签: go concurrency