libevent

最近基于 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

最小堆实现定时器

相关文章
相关标签/搜索