您的位置:首页 > 理论基础 > 计算机网络

libevent初探

2015-09-19 16:54 381 查看
虽然现在网上很多都是在讨论select,poll,epoll之间的不同,但是实际写程序的时候,从底层API开始的做法已经不多见了。要么自己写框架,要么就使用现成的开源框架,比如我将要提到的libevent。

#####为什么需要一个网络框架?

使用类似于APUE上的方法来编写一个较大的程序时有很多不方便的地方。自从reactor模式出现以后,可以很方便的编写基于时间驱动的程序。

有了libevent,可以封装系统底层API的不同,选择最适合系统的系统调用。但是现在主要程序都是跑在linux下,使用的都是epoll,那么我认为libevent提供的最大的方便就是提供了一个事件驱动编程的框架,我们可以自己设定回调函数,同时,libevent将IO,定时器,信号统一在一起,尤其是本来异步的信号处理,现在也通过Unix套接字变为同步了,极大的方便了我们程序的编写。

#####libevent改变了什么?

学习一个东西,首先要弄懂最主要的部分。我觉得libevent作为一个事件驱动的框架,给使用者带来的最大的改变就是编程方式上的改变。通过设计回调函数,可以将程序员从网络编程的细节中解放出来,专注于业务逻辑的设计。

#####我们能从libevent中学到什么?

第一还是设计思想上的转变,reactor模式确实也是现在网络框架的主流设计。同时,我觉得另外一个值得注意的点是如何将IO,timer和signal统一在一起。libevent的timer使用的API如select的超时机制,signal是通过一个Unix 套接字将异步转为同步,统一在一起。其实,现在版本较新的内核提供了timerfd和signalfd的新特性,统一起来会更加方便。不过没有对比过,不知道性能上有多大的不同。

至于libevent宣称的更高效的定时器的实现,其实其他的网络框架也是选择的小根堆,libevent所谓的优化也是现在数据结构的书上标准的优化做法,我觉得应该没有什么值得如此宣传的吧。

#####结语

上手了以后,使用libevent还是非常方便和直观的,尤其是现在提供了buffer以后,甚至都不用自己管理缓冲区了。在写程序的时候,有一点需要注意的是不能在除了eventloop的地方做耗时甚至阻塞的操作,如果确实有计算量比较大的需求操作,那么可以再开一个线程单独去做。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  网络编程 libevent