golang如何在对TCPConn进行Read的时候能够对它进行Write?

下面是一个简单的TCP服务器

在golang里一般采用开goroutine的方式来处理每个accept进来的客户端连接,假设客户端A连接上来,运行在一个goroutine里,为了接收A发来的数据,需要调用TCPConn的Read接口(第13行),如果A没有发数据过来,则当前的goroutine被阻塞住。假如这个时候服务器有消息需要广播,比如“XXX玩家成为了全服第一高手”,要把这条消息发给A,也就是调用A的TCPConn的Write接口,但此时A所在的goroutine已经被阻塞,怎么才能把消息发给A呢?

我想到了select语句可以实现非阻塞,但是select只对chanel生效。

还想到有就是再开一个goroutine,每个客户端有自己的goroutine做Read,然后用一个全局的goroutine来对所有的TCPConn做Write,但是这样的话就是在不同的线程里使用一个对象,应该是不正确的吧?

请各位指点~

共 2 个回复


stevewang

在另外一个goroutine里写。
go已经做了线程同步的支持,可以放心使用。

官方文档有说到:
Multiple goroutines may invoke methods on a Conn simultaneously.

如果在一个goroutine里执行全部socket的Write操作,会有很大的效率问题,因为Write是阻塞的。

# 0

ichenq

@stevewang
非常谢谢,那么明显的文档说明一直没有注意到~

# 1