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时可能队列已满,就会阻塞或报错。
相关文章推荐
- 1. 请问PHP里的ECHO是什么意思 ?请问PHP里的ECHO是什么意思???有什么作用???又应该怎么使用???
- JDK动态代理干了什么事情?为什么我的事务会不起效?spring的事务到底应该怎么使用?原理是什么?
- Go实战--golang中使用WebSocket实时聊天室(gorilla/websocket、nkovacs/go-socket.io)
- ocr文字识别软件应该怎么使用
- 不应该使用Connected属性作为Socket是否连接上的依据
- 怎么使用golang的channel做广播
- 第一篇文章不应该是hello world, 而是怎么使用markdowm
- Viewstate到底应该怎么使用
- 在linux下向U盘复制文件时发生错误,显示目标是只读的,windows下能够正常使用,应该怎么解决?
- 使用GCDAsyncSocket从服务器下载文件,怎么拼接NSData数据成为一个文件?
- Bash socket programming with /dev/tcp(大家能联想到怎么使用吗)
- 搜索引擎使用入门--如果我想开发chrome插件应该怎么做
- Linux怎么使用ss命令查看系统的socket状态
- 美容仪应该怎么挑选和正确使用方法经验
- Golang在windows下的socket编程(不使用net包和Cgo)
- 在linux下向U盘复制文件时发生错误,显示目标是只读的,windows下能够正常使用,应该怎么解决?
- 从ACE源代码库看Socket编程应该怎么写
- 跪求INDY10中idpop3和IdSSLIOHandlerSocketOpenSSL使用SSL连接Gmail用法,该怎么解决