我需要echo aaa向redis服務器發送三次,但它卡在了進程中間,我也檢查了是否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條經驗 獲得超9個贊
readFromServer 函數從 isWrite 通道接收一個值,然后阻塞對 io.Copy 的調用。io.Copy 函數直到 EOF 或讀取或寫入數據時出現錯誤才會返回。所有程序輸出都來自對 io.Copy 的單次調用。
第二次發送到 isWrite 在 sendToServer 塊中。isWrite 通道是一個無緩沖通道。在沒有接收方之前,無緩沖通道上的發送不會繼續。通道上沒有接收者,因為 readFromServer 在調用 io.Copy 時被阻塞。
可能的修復是:
修復方法是修改 readFromServer 以解析 RESP 協議并在循環中每次迭代只讀取一條消息。
將 readFromServer 中的 for 循環替換為對 io.Copy 的單個調用。
不需要 isWrite 通道。
該程序不確保 readFromServer 在程序退出之前讀取來自 writeToServer 的所有響應。
- 1 回答
- 0 關注
- 139 瀏覽
添加回答
舉報
0/150
提交
取消