基于事件的开源网络库—libevent:应用介绍

转载 2015年07月08日 11:37:37

一、简介

因memcached(见上一篇“数据缓存系统-memcached介绍”)使用了libevent作为它对外界事件(磁盘、网络等)的监控,所以对libevent就一同进行了了解、应用。

按libevent的官网(http://libevent.org/)介绍,libevent是一个监视特定事件,提供回调函数的C++库,它可以监视的事件包括:

1.      能以文件描述符表示的事件(网络、文件等)

2.      Signal信号(似乎对Linux平台适用)

3.      定时事件(timeout)

目前,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无一例外的采用事件驱动方式。)

 

二、版本

在1.X版,初始化event用的是event_init,它默认的是全局一个event base,这被认为不是线程安全的,所以,2.X以后,结构event base被暴露出来供用户使用,一些1.X的API不再适用了。

目前libevent的版本是2.0.20,也是本文采用的版本,网上一半以上的文章介绍的都是老版本,是不能在新版本下编译的。不过,libevent还是提供了类似XXX-compat.h这样的include文件,供老版本使用。所以,如果采用老版本,应包含XXX-compat.h这样的头文件。

Libevent2.0版本中,有一个目录event2,专门指的是2.0版本的。

 

三、编译

在linux下,该操作是一个典型编译操作,命令如下:

[plain] view plaincopy
  1. $ ./configure  
  2. $ make  
  3. $ make verify   # (optional)  
  4. $ sudo make install  
在windows下,可以用以下命令,前提是需要安装vc(vs)。

[plain] view plaincopy
  1. nmake –f makefile.nmake  

编译完毕后,应该有以下三个库:

  • libevent_core:所有核心事件功能和buffer功能,包括event_base,evbuffer, bufferevent, utility。
  • libevent_extra:提供某些特定协议的功能,包括HTTP, DNS, RPC。
  • Libevent:因历史原因而保留的库,包含以上两个库的内容, 不应再使用,以后可能消失。

因此,大部分情况下,我们需要的是libevent_core库。

 

四、组成和功能

libevent包含如下部分:

  • evutil

它抽象了一组辅助功能,并屏蔽了操作系统平台的不同。

  • event 及 event_base

这是libevent的核心,提供了一组不依赖于操作系统平台的基于事件的非阻塞IO操作。

  • bufferevent

这个功能基于libevent的事件驱动,提供了非常方便的IO读写,它也可以有多个后端支持,以充分利用操作系统的功能,例如Windows的IOCP API。

  • evbuffer

这个模块是bufferevent的基础,提供了高效的读写方法。

  • evhttp

一个简单的HTTP client/server实现。

  • evdns

一个简单的DNS client/server实现。

  • evrpc

一个简单的RPC实现。

五、基本应用框架

一个典型的libevent的应用大致需要如下步骤:

(环境设置)-> (创建event_base) -> (创建event,将此event加入到event_base中) -> (设置event各种属性,事件等) ->(将event加入事件列表 addevent) ->(开始事件监视循环、分发dispatch)。

监视事件发生后,事件处理函数可以只被调用一次或总被调用。

  • 只调用一次:事件处理函数被调用后,即从事件队列中删除,需要在事件处理函数中再次加入事件,才能在下次事件发生时被调用;
  • 总被调用:设置为EV_PERSIST,只加入一次,处理函数总被调用,除非采用event_remove显式地删除。

如果想退出事件监视循环,可调用event_base_loopexit,此时,event_base_dispatch会退出。

libevent中提供了需要辅助函数,例如listener.h中对listen,bind等的封装,http.h中对许多http应用的封装等,可以使用这些函数,读写网络时,似乎只能使用bufferevent中的东西。

目前的设计中,如果是多线程,建议一个线程一个event_base,互不影响,如果一个event_base需要多个线程共享,则需要加锁。


六、其他考虑

作为研究,到上一节的介绍就够啦,但正式应用libevent到你的商业系统,还需要考虑如下问题,

  • 日志

Libevent可以记录错误信息以及调试信息,缺省将其输出到stderr,但嵌入到应用系统后,一般采用应用系统的日志系统,此时,可以修改libevent的日志记录方式,调用event_set_log_callback,需要注意的是自己的日志记录函数不要使用libevent的函数,否则有可能发生难以预料的结果(循环调用)。

  • 错误退出

如果libevent发生不可恢复的错误(无论是你的事件代码还是它的代码),将调用exit或abort退出进程,调用event_set_fatal_callback可以修改这种行为,同样自定义函数不要使用libevent的函数。

  • 内存管理

Libevent采用C库中的内存管理函数分配和释放内存,调用event_set_mem_functions可以修改这种方式。(一般我们无需修改)

  • 多线程

如果采用windows平台或linux平台,系统提供了缺省的多线程支持,否则需要自己实现诸如创建线程、加锁、解锁等相关函数,然后通过evthread_set_lock_callbacks、evthread_set_id_callback告诉libevent。(看样子想完全跨平台还需自己努力了)

  • 调试

Libevent可以设置为调试状态,调用event_enable_debug_mode,当然仅在开发时使用。



相关文章推荐

基于事件的开源网络库—libevent:应用介绍

一、简介 因memcached(见上一篇“数据缓存系统-memcached介绍”)使用了libevent作为它对外界事件(磁盘、网络等)的监控,所以对libevent就一同进行了了解、应用。 ...
  • zhu2695
  • zhu2695
  • 2016年05月25日 00:15
  • 296

基于事件的开源网络库—libevent:应用介绍

一、简介 因memcached(见上一篇“数据缓存系统-memcached介绍”)使用了libevent作为它对外界事件(磁盘、网络等)的监控,所以对libevent就一同进行了了解、应用。 按l...
  • guxch
  • guxch
  • 2013年01月07日 11:07
  • 6836

libevent:一个在网络服务器中事件驱动开发库

Libevent 是一个基于事件触发的网络库。它提供一种机制,即当某个具体事件发生在一个文件描述符上或已经达到超时时,来执行某一个回调函数。此外,它也支持信号或定时器事件的回调。 Libevent 是...
  • liwg06
  • liwg06
  • 2017年03月01日 22:45
  • 223

libevent高性能网络库源码分析——事件循环(五)

libevent事件循环的流程 事件循环源码分析libevent事件循环的流程libevent将IO事件、信号事件和定时器事件很好的结合在一起,采用了统一的事件源方式,即把信号事件也转换成IO事件,然...

libevent高性能网络库源码分析——事件处理框架(四)

event_base结构 event_base的初始化 接口函数libevent中基于Reactor模式的事件处理框架对应event_base,在event在完成创建后,需要向event_base注册...

libevent库介绍--事件和数据缓冲

申明:本篇博客转载自 流年十维 仅供个人学习使用 http://www.cnblogs.com/liunianshiwei/ 是流年十维的博客地址首先在学习libevent库的使用前,我们还要从基本...

LIBEVENT事件驱动库(跨平台)介绍

libevent 是一个强大的跨平台的事件通知库,如果不想被多线程困扰,可以考虑这个平台,它从1.2.* 版本开始支持轻量级的http server 开发支持,随后陆续还推出轻量级 DNS serve...

LIBEVENT事件驱动库(跨平台)介绍

LIBEVENT事件驱动库(跨平台)介绍 libevent 是一个强大的跨平台的事件通知库,如果不想被多线程困扰,可以考虑这个平台,它从1.2.* 版本开始支持轻量级的http server 开发...

开源C/C++网络库比较 ace bosst libevent

ACE是一个大型的中间件产品,代码20万行左右,过于宏大,一堆的设计模式,架构了一层又一层,使用的时候, 要根据情况,看你从那一层来进行使用。   在开源的C/C++网络库中, 常用的就那么几个...

libevent高性能网络库源码分析——介绍(一)

libevent介绍 libevent源代码结构libevent介绍Libevent是一个开源的轻量级高性能网络库,基于C语言编写。该网络库基于事件驱动,具有如下优点:事件驱动,基于高性能的React...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于事件的开源网络库—libevent:应用介绍
举报原因:
原因补充:

(最多只允许输入30个字)