Go编程艺术 - 异步读写网络连接
(资料图片仅供参考)
在Go中,读写channel与读写Conn是的不一样的。一个协程可以通过select监听并读写多个channel, 但却不能类似这样监听并读写多个Conn(除非自行封装epoll)。如果想在一个协程中监听并读写多个channel和Conn, 那更不好办了。一般的方式是使用专门的协程来处理Conn的读写,使其转换为channel,以供主协程多路监听读写。
由于Conn读写都会阻塞协程,一般情况下,需要两个协程。一个用来读,一个用来写。此时一定要处理好读写的错误,要及时地关闭掉Conn,并退出两个协程,释放掉资源。
这里示例一下处理方法:
转化读写Conn为chan的收发
func process(conn net.Conn, reqch chan<- Request, rspch <-chan Response) { var wg sync.WaitGroup ctx, cancel := context.WithCancel(context.Background()) // 写 wg.Add(1) go func() { defer wg.Done() for { select { case req := <-reqch: _, err := conn.Write(req.Marshal()) if err != nil { conn.Close() return } // 处理数据 // ... } case <-ctx.Done(): // 读协程已关闭conn, 写协程需要立即退出。 return } }() // 读 go func() { defer wg.Done() rbuf := make([]byte, 1024) for { rlen, err := conn.Read(rbuf) if err != nil{ if err != net.ErrClosed() { conn.Close() // 及时通知写协程 cancel() } return } rsp := Unmarshal(rbuf[:rlen]) // 处理数据 // ... rspch <- rsp } }() wg.Wait()}
需要注意的是context,这个能保证两个协程的协调退出。
写协程写的时候出错,关闭掉Conn,退出;读协程会立即发现Conn已被关掉,退出。读协程读的时候出错,关闭掉Conn,cancel(), 退出。写协程立即发现Conn已被关闭,立即退出。关键的点在于,如果不用context, 写协程只有在下次Write的时候才能发现Conn已被关闭,而这个“下次”,不知道是什么时候。
这样就把对Conn的读写转化为了两个chan,主协程只需要两个chan通信。
func processProxy() { var conn net.Conn var reqch chan Request var rspch chan Response// ... go process(conn, reqch, rspch) select { case reqch <- req: // send case rsp := <-rspch: // recv default: // ok } }
当然,示例程序也不完美。比如,往reqch发送的时候,可以用一个函数封装一下,及时发现chan已满,发送报错。
关键词:
推荐阅读
新石器时代遗址 新石器时代遗址介绍
新石器时代遗址,1965年,英国考古学家卢伯克,首次提出了两个考古术语:旧石器时代和新石器时代。据此,中国史前文化按考古时间分为旧石器 【详细】
菜籽出油率多少?菜籽出油率高不高?
菜籽出油率多少?很多国家都有菜籽,成片的菜籽,美国农场主也不例外。一般来说,榨菜籽的出油率约为32%-36%。有些地区正常达到38%左右,主 【详细】
蓝太阳什么时候出现过 蓝太阳是怎么形成的?
平常晴天的时候都是可以看见太阳的,不过我们也知道平时看到的太阳是黄色的发光发亮的球体,不过今日北京出现蓝太阳,蓝太阳是什么意思?蓝 【详细】
低碳环保节能产业是什么概念 为什么环保受到大家的重视?
低碳环保节能产业,是什么概念,怎么理解?节能环保产业是指为节约能源资源、发展循环经济和保护生态环境提供物质基础和技术支持的产业,是 【详细】
dwg文件是什么 dwg文件用什么打开?
相信很多人都不知道dwg文件用什么打开?,接下来小编就带大家介绍一些方法,大家可以了解一下。一、看图纸参见图纸DwgSeePlus是一个dwg文件 【详细】
相关新闻
- Go编程艺术 - 异步读写网络连接
- 澳大利亚:没有奶牛的牛奶,合成生物学和奶农如何双赢?|世界头条
- 环球微资讯!“衰老问题能被精准改善吗?”美国AI智能技术诠释衰老“新概念”
- 起底“鸽王”贾跃亭:把一手烂牌打成王炸的商业奇才!
- 走近世界第四大洋南极洲(the Antarctic Ocean)!
- 今亮点!“地平线”互联网服务点 → 你打卡了吗?
- 某电信公司,想升级我的套餐,不答应便发短信辱骂-当前要闻
- 每日资讯:ChatGPT版搜索引擎突然上线,科技巨头们坐不住了!
- 每日动态!不止小米11系列,小米10系列也支持升级MIUI14稳定版?
- 初试chatGPT,似乎找到了一个C++编程助教_全球观天下
- PlugChain为什么被誉为2023年最有价值的预言机公链?_快讯
- 报道:一周科创资讯‖ 2023.01.28~02.03
- 购买iPhone14ProMax的理由
- 众名家实力打造 诚邀观众以舞入“梦” 中央芭蕾舞团原创芭蕾舞剧《红楼梦》即将在京首演
- 基于 AI 的 ERP:人工智能在 ERP 解决方案中的未来
- 【焦点热闻】AI智能是怎么看待延迟退休的
- Nature最新:新冠免疫力究竟以多快的速度消退
- 又有28款App被通报!详细名单看这里→ 关注
- 焦点快播:C++之父再“开枪”,美国安全局也要碰一碰
- 儿童JJ小怎么办_jj小怎么办 世界最新