用 Go 实现一个基于epoll 的 IO库

‍‍‍‍

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

排名不分先后。

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

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

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

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

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

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

f03cbb8e72b89b78484aaa500de407b8.png

简单的demo,

服务端:

d93700af5b4cd03464d11ae054764fa6.png

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

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

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

简单的客户端

d1b190df152f93e19e0728f346bcbc6b.png

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

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

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

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

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

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

- END -

扫码关注公众号「网管叨bi叨」

给网管个星标,第一时间吸我的知识 👆

网管整理了一本《Go 开发参考书》收集了70多条开发实践。去公众号回复【gocookbook】领取!还有一本《k8s 入门实践》讲解了常用软件在K8s上的部署过程,公众号回复【k8s】即可领取!

觉得有用就点个在看  👇👇👇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值