当前位置: 首页 > news >正文

libevent

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

最近基于 workerman 开发 Agent,workerman基于 libevent,另外memcached 也基于它。

按libevent的官网(http://libevent.org/)介绍,libevent 是一个监控特定事件,提供回调函数的C++库,内部使用 select、epoll、kqueue、IOCP 等系统调用管理事件机制。

git地址:https://github.com/libevent/libevent

总体来说,libevent有下面一些特点和优势:
* 事件驱动,高性能;
* 轻量级,专注于网络; 
* 跨平台,支持 Windows、Linux、Mac Os等; 
* 支持多种 I/O多路复用技术, epoll、poll、dev/poll、select 和kqueue 等; 

* 支持 I/O,定时器和信号等事件;

它可以监视的事件包括:

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

最小堆实现定时器

 

 

转载于:https://my.oschina.net/u/347414/blog/719098

相关文章:

  • linux下历史命令history使用方法
  • matlab灰度变彩色+白平衡算法实现
  • Activityd的四种启动模式
  • 详解web.xml中元素的加载顺序
  • HDU 5773 The All-purpose Zero
  • 整理样本标签
  • OpenSSL命令---s_client
  • Wireshark设置interface 时提示“There are no interfaces on which a capture can be done ”
  • MooseFS维护技巧集锦
  • linux 文件管理
  • Java安全——提供者相关的体系架构
  • 服务器TIME_WAIT和CLOSE_WAIT详解和解决办法
  • vijos 1426
  • 百度地图获取应用SHA1
  • Android Design Support Library使用详解——Snackbar
  • 深入了解以太坊
  • 0基础学习移动端适配
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Angularjs之国际化
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • java第三方包学习之lombok
  • Laravel Telescope:优雅的应用调试工具
  • Mysql优化
  • opencv python Meanshift 和 Camshift
  • 回顾 Swift 多平台移植进度 #2
  • 技术发展面试
  • 使用docker-compose进行多节点部署
  • 想写好前端,先练好内功
  • 一天一个设计模式之JS实现——适配器模式
  • 异常机制详解
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​决定德拉瓦州地区版图的关键历史事件
  • # 透过事物看本质的能力怎么培养?
  • #include<初见C语言之指针(5)>
  • (02)Hive SQL编译成MapReduce任务的过程
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (力扣)1314.矩阵区域和
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (算法)前K大的和
  • (一)WLAN定义和基本架构转
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • *p++,*(p++),*++p,(*p)++区别?
  • .Net 4.0并行库实用性演练
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Framework杂记
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net 中viewstate的原理和使用
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件