go语言怎么做的连接复用,怎么支持的并发请求,go的netpoll是怎么实现的像阻塞read一样去使用底层的非阻塞read
**题目来源:**字节跳动
答案1:
go语言怎么做的连接复用
go语言中IO多路复用使用netpool模型
netpoll本质上是对 I/O 多路复用技术的封装,所以自然也是和epoll一样脱离不了下面几步:
- netpoll创建及其初始化;
- 向netpoll中加入待监控的任务;
- 从netpoll获取触发的事件;
在go中对epoll提供的三个函数进行了封装
func netpollinit() func netpollopen(fd uintptr, pd *pollDesc) int32 func netpoll(delay int64) gList
netpollinit函数负责初始化netpoll;
netpollopen负责监听文件描述符上的事件;
netpoll会阻塞等待返回一组已经准备就绪的 Goroutine;
go语言怎么支持的并发请求
Go中有goroutine,所以可以采用多协程来解决并发问题。accept连接后,将连接丢给goroutine处理后续的读写操作。在开发者看到的这个goroutine中业务逻辑是同步的,也不用考虑IO是否阻塞。