Golang阻止通道阻塞

时间:2015-02-20 17:15:45

标签: concurrency go channel

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

答案 0 :(得分:3)

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

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