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

最小堆實現定時器

相關文章
相關標籤/搜索