获得徽章 0
- #青训营 x 字节后端训练营#
select+channel的多路复用,能实现完美的并发吗?
在go中引入了select语句来管理管道IO事件和实现协程通信,由于select语句在多case可执行的情况下只会挑选一个case分之执行,实现一个阻塞协程管理多个IO事件,节省了资源。但是select并不能实现完美的并发,比如我正在实现一个web-server,a协程中使用管道将缓冲区可读状态的connection传递给另一个协程b,协程b中采用select语句监听管道,当管道中有数据可读即触发case下的操作,在此我们在case实现一个阻塞操作,比如读取一个大文件等等,在case阻塞过程中,a协程还在不停的向管道发送资源,这样一批资源会在管道中堆积,由于堆积的是connection,那么被堆积的链接的客户端会感受到接口调用缓慢,非常影响体验。
展开评论1