并发 – Golang阻止通道阻塞

并发 – Golang阻止通道阻塞,第1张

概述我正在构建一个使用websockets的服务器. 目前,每个连接的客户端都使用两个goroutine.一个用于阅读,一个用于写作. 写作goroutine基本上会收听它应该发送的消息的频道,然后尝试传递它们. type User struct{ send chan []byte ...}func (u *User) Send(msg []byte){ u.send < 我正在构建一个使用websockets的服务器.
目前,每个连接的客户端都使用两个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}

基本上不是阻塞我想要缓冲区已满的错误处理.
我如何做到最好?

解决方法 正如ThunderCat在他的评论中指出的那样,解决方案是

func (u *User) Send(msg []byte){    select{    case u.send <- msg:    default: //Error handling here    }}
总结

以上是内存溢出为你收集整理的并发 – Golang阻止通道阻塞全部内容,希望文章能够帮你解决并发 – Golang阻止通道阻塞所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1266283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存