处理超时并收听频道

问题描述

我有类似以下的代码,在这里我一直在监听频道直到超时间隔。假设这个goroutine 1

select {
    case <-time.After(TimeoutInterval):
        mu.Lock()
        defer mu.Unlock()
        delete(msgChMap,index)
        return ""
    case msg := <-msgCh:
        return msg
}

在其他地方,我有一个goroutine 2,其运行方式如下,它从Map中获取相应的msgCh,删除地图中的条目,然后通过通道发送消息。

mu.Lock()
msgCh,ok := msgChMap[index]
delete(msgChMap,index)
mu.Unlock()
if ok {
    msgCh <- "yay"
}

似乎我可以从地图上获取消息频道msgCh,尝试发送消息,但是由于TimeoutInterval已经通过,因此没有人在收听该消息,并且我的代码将陷入等待侦听器的困境。如果在将yay发送到msgCh之后放了锁,似乎我可能会死锁,因为2将等待通道的侦听器并且没有释放锁,但是1不再监听,但需要锁定。

有什么通用模式可以避免在等待听众时陷入困境?也许去很聪明,不会被困在这里。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)