您的位置:首页 > 编程语言 > Go语言

golang中应该怎么使用socket?

2018-04-02 00:00 232 查看

问题

golang中没法多路复用,select只能支持channel的读写,不支持socket的读写。
所以问题是,怎么对socket高效的读和写?

分析

socket是可以并发读写

pkg/net文档:

Multiple goroutines may invoke methods on a Conn simultaneously.

读取

为了避免发送快、接收和处理慢导致阻塞,需要有专门的协程负责从socket上read,尽快读取。
读出来之后建议直接通过channel发给业务协程处理,避免耗时。

如果排队等待业务接收,也可能比较慢,导致数据堆积。不建议。

写入

虽然可以多协程并发调用write,但是write可能只写入部分成功。
所以如果多协程并发write,可能导致消息交叉。
所以需要在统一一个协程中写入。

方案

1、每个socket有一个读取协程和一个写入协程

2、读取协程尽快从socket读取,只做少量不耗时的处理,耗时处理交给业务协程

3、写入协程对输入排队,调用write。业务调用send时可能队列已满,就会阻塞或报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  golang socket 协程