第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通道卡住的 TCP 到 Redis 服務(wù)器

通道卡住的 TCP 到 Redis 服務(wù)器

Go
慕容森 2023-04-10 10:41:51
我需要echo aaa向redis服務(wù)器發(fā)送三次,但它卡在了進程中間,我也檢查了是否read和write操作得到錯誤消息,但它沒有。那么,為什么它會卡在進程中間呢?package mainimport (    "fmt"    "os"    "io"    "net"    "sync")var (    wg = new(sync.WaitGroup))func readFromServer(isWrite chan bool, r io.Reader) {    for {        select {        case <-isWrite:            _ , err := io.Copy(os.Stdout, r)            if err != nil {                panic(err)            }        }    }}func writeToServer(conn net.Conn , isWrite chan bool ){    defer wg.Done()    for i :=0; i<3; i++{        _ , err := conn.Write([]byte("*2\r\n$4\r\necho\r\n$3\r\naaa\r\n"))        if err != nil {            panic(err)        }        isWrite<- true    }}func main(){    wg.Add(1)    conn ,err := net.Dial("tcp","127.0.0.1:6379")    isWrite := make(chan bool)    if err != nil {        panic(err)    }    go readFromServer(isWrite, conn)    go writeToServer(conn , isWrite)    wg.Wait()    fmt.Println("finished...")}輸出:$3aaa$3aaaStuck here...
查看完整描述

1 回答

?
慕妹3146593

TA貢獻1820條經(jīng)驗 獲得超9個贊

readFromServer 函數(shù)從 isWrite 通道接收一個值,然后阻塞對 io.Copy 的調(diào)用。io.Copy 函數(shù)直到 EOF 或讀取或?qū)懭霐?shù)據(jù)時出現(xiàn)錯誤才會返回。所有程序輸出都來自對 io.Copy 的單次調(diào)用。

第二次發(fā)送到 isWrite 在 sendToServer 塊中。isWrite 通道是一個無緩沖通道。在沒有接收方之前,無緩沖通道上的發(fā)送不會繼續(xù)。通道上沒有接收者,因為 readFromServer 在調(diào)用 io.Copy 時被阻塞。

可能的修復(fù)是:

  • 修復(fù)方法是修改 readFromServer 以解析 RESP 協(xié)議并在循環(huán)中每次迭代只讀取一條消息。

  • 將 readFromServer 中的 for 循環(huán)替換為對 io.Copy 的單個調(diào)用。

不需要 isWrite 通道。

該程序不確保 readFromServer 在程序退出之前讀取來自 writeToServer 的所有響應(yīng)。


查看完整回答
反對 回復(fù) 2023-04-10
  • 1 回答
  • 0 關(guān)注
  • 148 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號