Golang Go语言中为什么说net包是对epoll的完美封装

发布于 1周前 作者 yuanlaile 来自 Go语言

和别的语音相比好在那里了


Golang Go语言中为什么说net包是对epoll的完美封装
22 回复

谁说的?

更多关于Golang Go语言中为什么说net包是对epoll的完美封装的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


先说是不是 再说为什么

如果完美了,我们开源项目就没必要再重新封装了。

你这就跟“中国专家”的“论证”似的
先确定结果,再找论据

谁说的?

给个出处?

谁说的去问谁

还要封装啥 go 不是有个装门的 M 来挂载要 io 的 G 的 epoll 事件吗,虽然看起来是 bio

介绍一下哪个开源项目重新封装了 epoll ,学习下

确实封的挺好,还和 runtime 绑定了;但是它的 raw 相关的太少了,还得用 x/net

完美其实谈不上的,只是在你的业务场景里面比较合适,golang 官方其实想实现的是一种 goroutine-per-connection 这样的极简的开发模式给使用者。这种开发模式极大地降低了开发者编写网络应用时的心智负担,且借助于 Go runtime scheduler 对 goroutines 的高效调度,不论从适用性还是性能上都足以满足绝大部分的应用场景。所以才说在你的业务应用场景里可能发挥的好。另外 net 包也只是调用,实现 epoll 的实际上是 runtime 包里面的 netpoll_epoll.go

net 包是 bio ,但 go 的协程是 nio ,所以应该是 go 原生封装了 epoll

大佬,请问为什么要重新封装 epoll

我是十分认同的

原生的其实底层也是用的 epoll ,但是到上层后必须要一个 goroutine 一个连接,我们是即时通讯的项目,如果 100 万同时在线,那就需要 100 万个 goroutine ,消耗还是很大的。

学到了谢谢大佬解答

怎么在这里也搞知乎式的问题

都用 go 了,高负载时不得上多机器分布式吗

真实 rpc 场景消耗还是太大了,一般还是会重新封装一层复用协程

确实组织的很完美,再结合 g 的调度,以及 timer 的结合,能让它表现出很强的性能和过程化开发能力(虽然说单个 poller 有些许不如意,但整体还是很强悍的,不信的同学可以 自己测试一下,我这有份测试代码,可以参考 https://github.com/shaovie/goev/blob/main/example/nettcp.go
可以研究一下 SetReadDeadline 的实现,感受其奥妙

完美,不是指能适配各种场景哦。

在Golang中,net包被公认为是对epoll的完美封装,这一评价主要基于以下几个方面:

  1. 高度封装:Go语言的net包在内部实现了epoll机制,但对外并未直接暴露epoll的接口,而是提供了更高层次的、易于使用的网络I/O接口。这种封装方式使得开发者无需直接操作复杂的epoll系统调用,即可实现高效的网络通信。
  2. 非阻塞与异步:net包中的网络操作(如连接、监听、读写)都是非阻塞的,这得益于epoll的异步通知机制。当文件描述符就绪时,epoll会通过回调机制通知Go运行时,从而避免了传统阻塞I/O带来的性能损耗。
  3. 协程友好:Go语言天生支持协程(goroutine),而net包中的网络操作与协程配合得非常好。当进行网络I/O操作时,如果数据未到达,当前协程会被挂起,而不会占用CPU资源。一旦数据到达,协程会立即被唤醒并继续执行,这种机制大大提高了程序的并发性能。
  4. 易用性:net包提供了简洁易用的API,如Dial、Listen和Accept等,使得开发者可以轻松地实现网络通信功能。同时,net包还处理了许多底层细节,如socket的创建、绑定、监听以及epoll对象的创建和管理等,进一步降低了开发难度。

综上所述,Go语言的net包通过高度封装、非阻塞与异步I/O、协程友好以及易用性等方面的优势,实现了对epoll的完美封装。

回到顶部