conn.Read通过其他go例程关闭conn进入无限循环

时间:2017-02-11 03:41:35

标签: go tcp goroutine

我的代码有点复杂,但简单来说它有多个go例程,所有拨号不同的tcp服务器,并在流上存在可读消息时在for循环中读取输入。到现在为止还挺好。现在还有另一个例程来管理前一批客户'并在用户想要时关闭它们。为此,我将每个人联系起来。与适当的常规客户端和关闭。

我所面临的问题是,只要我调用任何conn对象的close函数,它的'相应的Read函数进入无限循环,连续读取空字符串。

我编写了一个简单的代码,类似于我在多个go例程中处理连接的方式 - https://play.golang.org/p/wq7zt9Kqz7

TL; DR

总之,我有一个班级'它代表一个远程服务器及其地址,conn,waitgroup,并且我正在创建它的多个实例并在单独的go例程中处理它们的输入。在另一个例程中,我试图关闭其中一个实例,这个read()无限期地循环。

2 个答案:

答案 0 :(得分:1)

关闭连接上的

Read会返回错误。

应用程序应该在TCP连接上从Read返回的任何错误中断掉读取循环。 Break on error处理所有这些情况:应用程序关闭另一个goroutine中的连接,peer关闭连接,网络错误。

在TCP连接的近端和该连接上的阅读器之间进行协调不需要其他同步。

答案 1 :(得分:0)

我认为你应该使用信号量(通道,选择内部方法),所以,当你调用stop时,它会发送一条消息(boolean或int),当方法从这个通道获取消息时,它会关闭连接并停止go rutine。

简短的例子

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

您可以在那里找到更多示例 Stackoverflow