LibEvent使用經驗

最近一個項目中需要提供一個簡單的採用http post協議的服務,開發語言是C++,考慮到各種因素,最終決定直接採用libevent,一方面比較熟悉,另一方面也可能複用其提供的定期事件回調,不然自己編寫一個類似Reactor的框架花費太大。

下面是一些關於libevent的介紹文章:

官方網站:http://libevent.org/

官方手冊:http://www.wangafu.net/~nickm/libevent-book/

API文檔:http://www.wangafu.net/~nickm/libevent-2.1/doxygen/html/

Min同學的分享:http://54min.com/post/http-server-using-libevent.html

中文手冊:

  1. 前言
  2. 設置libevent(上)
  3. 設置libevent(下)
  4. 異步IO簡介
  5. 創建event_base
  6. 與事件循環一起工作
  7. 與事件一起工作
  8. 輔助類型和函數
  9. bufferevent:概念和入門
  10. Evbuffers用於緩衝IO的實用工具 
  11. 連接偵聽器: 接受 TCP 連接

下面介紹我在使用中的一些經驗:

1. libevent2.0之後的版本,建議都使用 event_base_* 接口,這樣可以在一個應用程序中創建多個event_base結構,在不同線程開啓多個消息循環,進一步利用CPU資源。

2. libevent2.0之後,建議不要再鏈接libevent,而是根據需要鏈接libevent_core,libevent_extra。其中:libevent_core提供了event_base, evbuffer, bufferevent,utility等常用方法;libevent_extra則提供HTTP, DNS, 以及RPC等高級功能;另外,如果以多線程方式使用libevent,則還需要鏈接libevent_pthreads;如果用到ssl,可以再鏈接libevent_openssl。

3. 關於是否需要鏈接libevent_pthreads,很多人不是很清楚,我可以舉個例子,當某個線程中正在執行event_base_loop()時,只有當這個線程中某個事件被觸發,然後在事件回調中調用event_base_loopbreak()或event_base_loopexit()才能停止消息分發(如果是單線程程序,也可以在信號處理函數中調用),如果沒有libevent_pthreads,並指定使用線程特性,則在其他線程中調用event_base_loopbreak()或event_base_loopexit()是無法立即停止這個正在跑的線程的,只有使用使用了 evthread_use_pthreads() 或 evthread_windows_pthreads()的程序才能在其他線程關閉這個消息循環。

4. 如果希望一次event_base_loop()或event_base_dispatch()在跑一定時間後結束,應該先調用event_base_loopexit(),配置好超時,再調用event_base_loop(),這樣纔會在到達超時後結束。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章