分类:
2011-12-14 01:51:55
原文地址:libevent – 事件通知接口函数库 作者:CUKdd
今天在研究memcached软件时,接触到了libevent - 事件通知接口函数库,发现了它对高性能,高并发,可移植等诸多方面提供了相当多的便利。心里甚是欢喜,因此,这里就想把这个好家伙介绍给大家,共同分享分享。
说在前边,恕小弟无知,其实libevent软件包早在2000年11月14号就发布了0.1版本,已经发展了11个年头了。如今才被窝发现,真是羞愧难当啊:-< 不过还好,发现了总归是好事。那接下来,就该抓紧时间补习功课了。
1. 介绍
libevent是一个用来开发可扩展的网络服务器的事件通知函数库。当一个文件描述符上的特定事件发生或是一个超时时间到达后,libevent API提供一种执行回调函数的机制。而且,libevent还支持基于信号或定期超时的回调功能。
libevent旨在替换在原有事件驱动网络服务器事件循环而设计的。应用程序仅仅需要调用event_dispatch(),然后动态地添加或是移除事件就可以了,而不需要改变原有的事件循环。
目前,libevent支持/dev/poll,kqueue(2),select(2),poll(2)和epoll(4)等高并发网络编程模型。而它对实时信号的支持正处于实验性阶段。内部的事件处理机制是完全独立于暴露出来的API的,并且新功能的加入并不需要重新设计应用程序,而是仅仅需要做一个简单的libevent更新即可。因此,lievent允许可移植性的应用程序开发,并且能够提供适合特定操作系统的最具可扩展性的事件通知机制。libevent同时也可用于多线程编程环境,更多说明请看Steven Grimm的说明。libevent可以在Linux,*BSD,Mac OS X,Solaris和Windows系统上编译。
2. 标准用法
每一个使用libevent的程序,都需要包含
3. 事件通知
对于每一个你想监视的文件描述符,你必须声明一个事件结构并且调用event_set()去初始化结构中的成员。为了激活通知,你需要通过调用event_add()将该结构添加到监视事件列表。只要是该事件存活,那么就需要保持该已allocated的事件结构,因此该事件结构需要在堆(heap)上申请。最后,需要调用event_dispatch()函数循环和调度事件。
4. I/O缓冲区
libevent提供了一个定期回调事件顶层的抽象。该抽象被称为缓冲事件(buffered event)。缓冲事件提供自动地填充和流掉(drained)的输入和输出缓冲区。缓冲时间的用户不再需要直接操作I/O,取而待之的是仅仅从输入缓冲区读,向输出缓冲区写就可以了。
一旦通过bufferevent_new()进行了初始化,bufferevent结构就可以通过bufferevent_enable()和bufferevent_disable()重复地使用了。作为替代,对一个套接口的读写需要通过调用bufferevent_read()和bufferevent_write()函数来完成。
当由于读事件而激活bufferevent时,那么后续将会自动回调读函数从该文件描述符读取数据。写函数将会被回调,无论何时这个输出缓冲区空间被耗尽到低于写的下水位(low watemark),通常该值默认为0。
5. 定时器
libevent通过创建一个定时器来参与到一个经过一定超时时间后的回调事件中。evtimer_set()函数将准备(分配)一个事件结构被用于作为一个定时器。为了激活定时器,需要调用evtimer_add()函数。相反,需要调用evtimer_del()函数。
6. 超时
除了简单的定时器,libevent可以为文件描述符指定一个超时事件,用于触发经过一段时间后而没有被激活的文件描述符执行相应的操作。timeout_set()函数可以为一个超时时间初始化一个事件结构。一旦被初始化成功,那么这个事件必须通过timeout_add()函数激活。为了取消一个超时事件,可以调用timeout_del()函数。
7. 异步DNS解析
libevent提供了一个异步DNS解析器,可用于代替标准的DNS解析器。这些函数可以通过在程序中包含
8. 事件驱动的HTTP服务器
libevent提供了一个简单的可以嵌入到你的程序中的并能处理HTTP请求的事件驱动HTTP服务器。
为了使用这种能力,你应该在你的程序中包含
9. RPC服务器和客户端框架
libevent提供了一个创建RPC服务器和客户端的编程框架。它将托管所有的编组和解组的数据结构。
10. API参考
要浏览完整的libevent的API文档,点击以下链接。
http:// -> event.h libevent主要的头文件
-> evdns.h 异步DNS解析器
-> evhttp.h 内置的基于libevent的HTTP服务器
-> evrpc.h 创建RPC服务器和客户端的编程框架
祝好!