golang 新手,最近准备用 go 实现一个网络通信的框架,看了一下 demo 发现, 服务端启动好端口后, 一般都会启动一个协程负责写,比如如果想给客户端主动发一个消息,通常会先发给这个客户端链接的 channel 里,然后通过负责写的协程把消息读出来在调用 conn 的 write ,很多都是这种生产消费的模式。难道直接找到这个链接调用 write 不行吗, 还是有什么性能问题?
1
lhbc 2023-06-01 19:44:38 +08:00 via Android
为了高并发
|
2
lesismal 2023-06-01 19:56:38 +08:00
标准库的 net.Conn 底层是异步 io ,但提供给应用层的读、写都是阻塞接口。
1. 对于读:如果不使用一个协程循环读,它目前也没有提供事件回调机制通知用户数据到来,所以用户不知道什么时候可读,所以就循环等待读、读到了就处理。 2. 对于写:如果涉及广播、或者不允许写阻塞免得业务被卡住,那么也得自己封装异步写的机制 自己写也可以,但既然对读写还有疑问,估计 OP 要摸索很久才能做完善。 想省力的话可以直接用我的: https://github.com/lesismal/arpc https://github.com/lesismal/nbio |
3
Nazz 2023-06-01 20:51:14 +08:00 via Android
当然可以直接写。串行从网络连接读取数据,并行处理业务逻辑,业务协程里面可以直接写,不会阻塞读。
|
4
lysS 2023-06-02 10:01:47 +08:00
你说的那应该是抽象拆分带来的问题,本来就应该直接写的。
|