2017-02-11 29 views
-1

我的代碼有點複雜,但簡單地說,它有多個go例程,所有撥號不同的tcp服務器和讀取for循環時的輸入在流上存在可讀的消息。到現在爲止還挺好。現在有另一個去管理以前的一羣'客戶',並在用戶需要時關閉它們。爲此,我已將每個'conn'與適當的常規客戶關聯起來並關閉它。conn.Read去關閉conn通過其他去例行程序的無限循環

我面臨的問題是,只要我調用任何conn對象的close函數,其相應的Read函數就會在無限循環中連續讀取空字符串。

我寫了一個簡單的代碼,它類似於我在處理多個連接去routines- https://play.golang.org/p/wq7zt9Kqz7

TL的方式; DR

總之我有一個「類」,這代表一個遠程服務器的地址,conn,waitgroup在裏面,我創建了它的多個實例並在不同的go例程中處理它們的輸入。而在另一個去例程中,我試圖關閉其中一個實例,並且這個read()會無限期地循環。

+0

您是否正確關閉了waitgroup(我在問,因爲示例代碼沒有提及任何關於它的內容)另外,如果您正確關閉子例程,示例代碼不會記錄文檔。 – Fallen

回答

0

我認爲你應該使用信號量(頻道,選擇內部方法),所以,當你調用stop時,它會發送一個消息(布爾或int),當方法從這個通道獲取消息時,它將關閉連接並且停止走rutine。

簡短的例子

select{ 
case <- stopChannel: 
//Do stuff to close connection 
case default: 
//Do stuff to read from connection 
} 

更多例子,你可以發現有 Stackoverflow

+0

頻道是我的第一選擇,但問題是我想讓我動態創建「遠程服務器」實例,但我無法弄清楚如何處理頻道。在等待組的情況下,每當我收到新服務器的請求時,我都很容易在循環中使用wg.Add(1)。 – darthvading

1

Read關閉的連接上返回一個錯誤。

應用程序應該跳出對TCP連接上從Read返回的任何錯誤的讀取循環。錯誤中斷處理所有這些情況:應用程序關閉另一個goroutine中的連接,對等關閉連接,網絡錯誤。

不需要其他同步來協調TCP連接和該連接上的閱讀器之間的距離。