libevent使用经验

来源:互联网 发布:怎样装饰淘宝店铺2016 编辑:程序博客网 时间:2024/05/01 09:51

最近一个项目中需要提供一个简单的采用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(),这样才会在到达超时后结束。


0 0
原创粉丝点击