目前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
推荐阅读