event的本质

libevent2中的event的本质是什么?只要是非同步阻塞的运行方式,肯定遵循事件的订阅-发布模型。通过event_new的函数原型可以理解,一个event即代表一次订阅,建立起了fd变化的事件与callback响应函数之间的一个关联。

订阅-发布模型有四个方面,事件定义、事件订阅、事件触发、事件响应。libevent2与之的对应关系如下:

* 事件定义:由系统定义,比如IO相关的源(如socket)有read/write事件。libevent2定义了4个类型的事件:EV_TIMEOUT、EV_READ、EV_WRITE、EV_SIGNAL

* 事件订阅:由用户在代码中完成订阅,通过新建event对象并调用event_add实现事件的订阅。新建的event对象中就包含了关注的源是哪个fd, 关注的事件是四个事件中的哪些(一般只关注一个事件),关联的回调函数是什么。通过event_add将event添加到事件监听队列中。

* 事件触发:由libevent2底层负责,底层实现有多种方式,select为其中的一种。对于select方式,调用select()返回的可读列表即触发EV_READ事件,返回的可写列表即触发EV_WRITE事件。那么由谁来发起调用select()函数呢?通过调用event_base_dispatch()来发起调用。由此也可以看到event_base的作用。一旦事件被触发,就会将与该fd关联的事件监听队列中的所有的event添加就绪队列中。

* 事件响应:由libevent的event_base负责,处理就绪队列,对于队列中的每个event, 调用它的回调函数。

使用libevent2的流程

  1. 调用event_base_new()创建一个event_ base对象。
  2. 调用event_new(base, fd, flag, callback, args)创建一个event对象
  3. 调用event_add(event, NULL)添加event,即添加对fd通知事件的响应
  4. 调用event_base_dispatch(base)开始事件轮询。

下一篇将按照这个流程分析libevent2的源代码。

libevent2源码分析之一:前言的更多相关文章

  1. Spring Ioc源码分析系列--前言

    Spring Ioc源码分析系列--前言 为什么要写这个系列文章 首先这是我个人很久之前的一个计划,拖了很久没有实施,现在算是填坑了.其次,作为一个Java开发者,Spring是绕不开的课题.在Spr ...

  2. Spring mvc源码分析系列--前言

    Spring mvc源码分析系列--前言 前言 距离上次写文章已经过去接近两个月了,Spring mvc系列其实一直都想写,但是却不知道如何下笔,原因有如下几点: 现在项目开发前后端分离的趋势不可阻挡 ...

  3. jquery源码分析之一前言篇

    1.问:jquery源码分析的版本是什么? 答:v3.2.1 2.问:为什么要分析jquery源码? 答:javascript是一切js框架的基础,jquery.es6.vue.angular.rea ...

  4. Spring boot 源码分析(前言)

    开坑达人 & 断更达人的我又回来了 翻译的坑还没填完,这次再开个新坑= = 嗯,spring boot的源码分析 本坑不打算教你怎么用spring boot = = 也不打算跟你讲这玩意多方便 ...

  5. libevent2源码分析之三:信号的初始化流程

    libevent2对信号的响应也进行了封装,使之与socket操作一样对外提供统一的接口.这里的信号一般指linux的信号.由于信号与socket相关的编程接口有较大的不同,因此在内部实现也有一些区别 ...

  6. libevent2源码分析之二:初始化流程

    本文并不很详细地分析初始化的各个细节,而重点分析如何将底层操作关联到event_base的相关字段.初始化工作主要是针对event_base的.libevent2支持多种底层实现,有epoll, se ...

  7. libevent2源码分析之五:关键的调用链

    用一个调用链来表示函数调用的流程,看起来更直观.根据上面的分析,总结了一些重要的调用链. 初始化 event_base_new event_base_new_with_config min_heap_ ...

  8. libevent2源码分析之四:libevent2的消息泵

    Dispatch类似于一个消息泵,在一个死循环中,不停地检查IO的状态(可以想像成不断从消息队列中读取消息),将状态的改变变成事件,再进行事件的响应. 主要代码如下: [event.c] int ev ...

  9. ConcurrentHashMap 源码分析

    ConcurrentHashMap 源码分析 1. 前言    终于到这个类了,其实在前面很过很多次这个类,因为这个类代码量比较大,并且涉及到并发的问题,还有一点就是这个代码有些真的晦涩,不好懂.前前 ...

随机推荐

  1. Python shell 控制台,有个快捷键可以向dos那样通过上下键来选择之前输入的内容?

    Alt + p 往前: Alt+n 从头开始历史输入

  2. [转载]数据层的多租户浅谈(SAAS多租户数据库设计)

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-dataMultitenant/index.html 在上一篇“浅析多租户在 Java 平台和某些 ...

  3. linux--redis的安装和配置和开启多个端口

    在workerman开发过程中需要安装redis来存储用户ip.端口等信息 首先UBUNTU中安装redis: apt-update  //更新apt包源apt-get install redis-s ...

  4. AC日记——T-Shirt Hunt codeforces 807b

    T-Shirt Hunt 思路: 水题: 代码: #include <cstdio> #include <cstring> #include <iostream> ...

  5. 使用CreateRemoteThread把代码远程注入指定exe执行

    由于本人也是新手,如果有朋友不懂windows api相关知识,我相信查阅书籍或者百度会比我说有帮助的多,下面就我所做简单复述一下过程,欢迎指正缺点. 效果图示如下: 做的这个例子首先是创建了一个MF ...

  6. Centos7重置root密码的方法(亲测有效)

    CentOS 7的更新还是非常大的,很多平时使用的命令已经变化了,要上手还真要一段时间.比如忘记root密码.在5.6的系统中直接进入单用户模式下,一个passwd命令修改,重启即可.但是在Cento ...

  7. sql developer 自定义快捷键

  8. Java的ClassLoader机制

    http://blog.chenlb.com/2009/06/java-classloader-architecture.html http://blog.csdn.net/lovingprince/ ...

  9. 【动态规划】bzoj1270 [BeijingWc2008]雷涛的小猫

    暴力dp是n^2*m的……我们计算每棵树在每层的答案的时候,都需要计算出从那棵树转移过来最优. 但是我们发现,对一棵树而言,从上面转移过来都是一样的,所以我们可以在计算每棵树在每层的答案的时候,先预处 ...

  10. RxJava 2.x 理解-3

    背压:Flowable / Subscriber 在RxJava 1.x 理解 中,没有讲到背压这个概念,是因为学习太落后了,RxJava都出2了,所以直接在2上学. 背压是下游控制上游流速的一种手段 ...