目前,每个连接的客户端都使用两个goroutine.一个用于阅读,一个用于写作.
写作goroutine基本上会收听它应该发送的消息的频道,然后尝试传递它们.
type User struct{ send chan []byte ...}func (u *User) Send(msg []byte){ u.send <- msg}
问题是,来自客户端A的读取可能导致写入客户端B.
假设与B的连接存在一些问题(例如非常慢)并且它的发送通道已经满了.目前的行为是,尝试向频道添加消息现在开始阻止,直到从频道中删除某些内容.
这意味着,现在A等待B的缓冲区不再满.
我想解决它有点像这样:
func (u *User) Send(msg []byte) err{ u.send,err <- msg if err != nil{ //The channels buffer is full. //Writing currently not possible. //Needs appropriate error handling. return err } return nil}
基本上不是阻塞我想要缓冲区已满的错误处理.
我如何做到最好?
func (u *User) Send(msg []byte){ select{ case u.send <- msg: default: //Error handling here }}总结
以上是内存溢出为你收集整理的并发 – Golang阻止通道阻塞全部内容,希望文章能够帮你解决并发 – Golang阻止通道阻塞所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)