最近基於 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
最小堆實現定時器