簡體   English   中英

Golang阻止通道阻塞

[英]Golang prevent channel from blocking

我正在構建一個使用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
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM