最近基于 workerman 开发 Agent,workerman基于 libevent,另外memcached 也基于它。html
按libevent的官网(http://libevent.org/)介绍,libevent 是一个监控特定事件,提供回调函数的C++库,内部使用 select、epoll、kqueue、IOCP 等系统调用管理事件机制。ios
git地址:https://github.com/libevent/libeventnginx
整体来讲,libevent有下面一些特色和优点:
* 事件驱动,高性能;
* 轻量级,专一于网络;
* 跨平台,支持 Windows、Linux、Mac Os等;
* 支持多种 I/O多路复用技术, epoll、poll、dev/poll、select 和kqueue 等; git
* 支持 I/O,定时器和信号等事件;github
它能够监视的事件包括:编程
1. 网络 IO(socket):能以文件描述符表示的事件(网络、文件等)服务器
2. Signal信号(彷佛对Linux平台适用)网络
3. 定时事件(timeout)数据结构
定时器:使用了最小堆数据结构,以达到高效查找、排序、删除定时器的目的;多线程
IO和信号的实现均使用了双向队列(用链表实现)。网络 关注一下 epoll
【能够研究一下】
目前,libevent支持的平台事件监视函数,包括/dev/poll, kqueue(2), event ports, POSIX select(2), Windowsselect(), poll(2), epoll(4),它能够用于多线程应用,因为隔离了底层调用,上层与底层的更新互不影响,除了对事件的监视,libevent还提供了如下的辅助功能:
1. 带buffer的网络IO-这个东西是libevent中读取网络的接口。
2. 简单的DNS,HTTP Sever和RPC框架
总之,libevent做为网络编程框架,其功能仍是比较强大的,官网中有一个采用libevent的应用列表,其中就包括memcached。
(网络编程采用事件回调的方式,大概是高负荷网络IO应用的主要模式,两个主要的开源Web服务器nginx,lighttpd无一例外的采用事件驱动方式。)
event_init() => evtimer_set() => event_add() =>event_dispatch()
#include <stdio.h> #include <iostream> // libevent头文件 #include <event.h> using namespace std; //定时事件回调函数 void onTime(int sock, short event, void *arg) { cout << "Game Over!" << endl; struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; // 从新添加定时事件(定时事件触发后默认自动删除) event_add((struct event*)arg, &tv); } int main() { // 初始化 event_init(); struct event evTime; // 设置定时事件 evtimer_set(&evTime, onTime, &evTime); struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; // 添加定时事件 event_add(&evTime, &tv); // 事件循环 event_dispatch(); return 0; }
一些资料:
* libevent官网:http://libevent.org/
* libevent API:http://www.monkey.org/~provos/libevent/doxygen-2.0.1/index.html
* CSDN上剖析得很赞的文章:http://blog.csdn.net/sparkliang/article/details/4957667
最小堆实现定时器