为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 防止通道阻塞

Golang 防止通道阻塞

Go
明月笑刀无情 2021-09-13 19:52:15
我正在构建一个使用 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}基本上,我想要错误处理而不是阻塞,以防缓冲区已满。我如何做到最好?
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

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


func (u *User) Send(msg []byte){

    select{

    case u.send <- msg:

    default: //Error handling here

    }

}


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信