分享
golang中应该怎么使用socket?
chuqingq · · 3005 次点击 · · 开始浏览这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。
问题
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时可能队列已满,就会阻塞或报错。
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
关注微信3005 次点击
添加一条新回复
(您需要 后才能回复 没有账号 ?)
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码` - 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传
收入到我管理的专栏 新建专栏
问题
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时可能队列已满,就会阻塞或报错。