Golang 防止通道阻塞

我正在构建一个使用 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

}

基本上,我想要错误处理而不是阻塞,以防缓冲区已满。我如何做到最好?


明月笑刀无情
浏览 199回答 1
1回答

慕少森

正如 ThunderCat 在他的评论中指出的那样,解决方案是func (u *User) Send(msg []byte){&nbsp; &nbsp; select{&nbsp; &nbsp; case u.send <- msg:&nbsp; &nbsp; default: //Error handling here&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go