用 Go 基于 epoll 实现一个最小化 IO库
2023-6-30 11:30:56 Author: Go语言中文网(查看原文) 阅读量:12 收藏

目前Go圈有很多款异步的网络框架:evio,nbio,gnet,cloudwego/netpoll......,

排名不分先后。

这里面最早的实现是evio。evio也存在一些问题,之前也写过evio文章介绍过。其他比如nbio和gnet也写过一些源码分析。

这些框架在应用层上做了很多优化,比如:Worker Pool,Buffer,Ring Buffer,NoCopy......。

都分析了好几篇代码了,咋么说也得自己动手搞一个来达成学习目的。

没错,这就是easyio的由来。easyio是一个最小化的IO框架,只实现最核心的部分,加起来不超过500行代码。

也没有用户端上层应用的优化,且目前只实现了linux的epoll,以及只能运行tcp协议。

大概结构如下,具体可以看代码~~

简单的demo,

服务端:

上面的代码,初始化一个easyio,启动一个tcp服务,监听端口8090,options里面设置epoll的数量,以及设置事件处理器。

当一个新连接到来时会回调 OnOpen函数,此时你可以设置自定义的ctx,那么当对应连接读事件到来OnRead回调,你可以拿到之前设置的ctx,调用conn.Read读取数据,且通过Write向对端写数据。

这里需要注意的是,一个连接如果数据没读完,当OnRead执行结束,下一轮会继续触发回调代码,因为底层epoll采用的是LT触发方式。

简单的客户端

看懂和会写出来是完全不一样的概念。理论与实践是相辅相成的,只有理解了理论并将其应用于实践中,我们才能真正掌握知识

因为之前读者问过一些问题,我计划编写一个从零开始实现的 easyio 系列教程,希望能够帮助一些小白通过实践来加深对这个主题的理解。

如果你对这个系列感兴趣,请在下方留言或点赞。

决定要做的话,整个系列大概可以拆分成5~6篇文章(当然不收费~)。

最后让这个世界充满爱~~~

easyio源码:https://github.com/wuqinqiang/easyio


推荐阅读

福利
我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。


文章来源: http://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651454491&idx=1&sn=d00faec3bfadf95cd5ed69587c6a8005&chksm=80bb22e9b7ccabfff53b6b7062d4eee70de1049dc2f1d69d7b66bbea192a5791c03f872ceaa8#rd
如有侵权请联系:admin#unsafe.sh