底层IO事件,以及借用socket poller的上层0MQ socket事件。

先来看用于底层和上层的两种poller。

这是用于底层io事件的poller_t,每个socket_base_t都关联到一个poller_t,这个poller_t运行在io_thread_t线程上。

这是运行在0MQ socket层的事件poller。运行在你的控制线程,也就是你编程的线程。

每次你使用zmq_poller_poll都会创建一个sokcet_poller_t去进行poll。

我们要去轮询一个0MQ socket层事件,我们会通过zmq_poll将socket_base_t添加到poller而不是底层fd。

item_t的第二个成员是pollfd,在这里设置为0,表示并不使用fd进行poll。

下面再看socket_poller_t::wait

注释写得很清楚,并不是在poll底层的fd,在poll返回后,遍历所有socket_base_t,并getsocket去取ZMQ_EVENTS事件。zmq_poll被唤醒一般是0MQ socket通过signaler_t去发送唤醒信号。

再来看socket_poller_t::rebuild(), 这是每次socket_poller_t::wait()之初都调用的。

其中它为我们需要进行zmq_poll的socket_base_t进行了pollfd的关联,但不是socket_base_t底层的socket fd,而是ZMQ_FD选项。我们就来看ZMQ_FD到底返回什么给我们。

ZMQ_FD返回的是这个socket_base_t所关联的mailbox的signaler_t的fd。有关mailbox请看上一篇<<底层队列设计>>。到这里就清楚了,zmq_poll会在每个socket_base_t关联的mailbox的signaler_t的fd等待有poll事件发生,而socket_base_t向它所关联的mailbox发送事件就会唤醒zmq_poll。zmq_poll借用了socket poll或select来实现对上层事件的分离等待。每个socket_base_t在初始化的时候都会创建自己的mailbox。

mailbox_t和mailbox_safe_t的不同,就是为zmq_poll服务的。mailbox_t 使用自身的signaler_t,而mailbox_safe_t 使用的signaler_t 是那个使用它的socket_poller_t,并且一个mailbox_safe_t 可以绑定多个signaler_t 。当一个socket_base_t被多个socket_poller_t进行zmq_poll时,每个线程只能运行一个zmq_poll,也就是有多个线程在zmq_poll。这时各个poller只对它自身的signaler_t进行poll,所以是线程安全的。而mailbox_t的情况却是一个signaler_t被多个poller同时在poll。系统调用poll和select是不支持多线程的。

0MQ 事件驱动 以及 poller的更多相关文章

  1. Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程

    Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程 这里的函数式编程的设计以muduo为例进行对比说明: Reactor实现架构对比 面向对象的设计类图如下: 函数式编程以muduo为例 ...

  2. 0MQ底层队列设计

    ypipe_t has a yqueue_t. pipe_t relates two ypipe(s).pipe_t就是0MQ框架内使用的底层队列. yqueue_t的设计目的. yqueue_t 的 ...

  3. C++ 事件驱动型银行排队模拟

    最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...

  4. Node学习笔记(二):事件驱动

    接触Node,提得最多的可能就是回调,异步非阻塞处理,思前想后,JavaScript从前端语言过渡到服务器端,最大的劣势可能就是线程,当然这方面的不足现在也被慢慢弥补起来了(很多第三方的npm包可供下 ...

  5. IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)

    上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动架构 Domin Event-领域事件 Long-Runni ...

  6. ZeroMQ接口函数之 :zmq - 0MQ 轻量级消息传输内核

    官方网址:http://api.zeromq.org/4-0:zmq zmq(7) 0MQ Manual - 0MQ/3.2.5 Name zmq – ØMQ 轻量级消息传输内核 Synopsis # ...

  7. 输入事件驱动---evdev_handler的大致实现流程(修整版)

    一.input输入子系统框架 下 图是input输入子系统框架,输入子系统由输入子系统核心层(input core),驱动层和事件处理层(Event Handler)三部分组成.一个输入事件,比如滑动 ...

  8. NodeJS中的异步I/O、事件驱动

    nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...

  9. 事件驱动之Twsited异步网络框架

    在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...

随机推荐

  1. vue——父子组件间传值

    (1)父组件给子组件传值(商品详情页): 根据订单类型,判断显示立即购买/立即拼单: 通过props来传递参数 父组件(商品详情页) 父组件调用子组件,在子组件的标签中,通过:数据名称=”数据”的形式 ...

  2. MySQL注入--Payload

    MySQL注入--Payload Mirror王宇阳 2019-10-22 SQL的注入流程一般如下: 1.判断是否有SQL注入漏洞(判断注入点) 2.判断数据库的系统架构.数据库名.web应用类型等 ...

  3. 盘点那些适配Linux的国产常用软件

    前几天,10月24日,在这个程序员的节日里,腾讯时隔十一年,更新了QQ for Linux.瞬间,各大技术论坛,群聊,关于Linux的新QQ的话题不断.为什么QQ这么多年不更新QQ for Linux ...

  4. 记录一次gdb debug经历

    目录 问题描述 查看core文件 使用gdb查看core文件 总结 问题描述 今天在写代码时,运行时奔溃了.segment fault,而且是在程序退出main()函数后,才报的. 唯一的信息是:Se ...

  5. 学习python3高阶函数笔记和demo

    python的高阶函数的定义是:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数 举一个最简单的例子: def text(a,b,c): return c(a)+c(b) print( tex ...

  6. 云计算 docker 容器使用命令

    docker 使用命令: docker version 查看docker版本号 vi /etc/docker/daemon.json { "registry-mirrors": [ ...

  7. 闪讯 开启wifi教程

    这是我自己试了几次之后发现的,也不是什么技术活. 首先说下,我的比较是小米pro笔记本,一般笔记本都是自带wifi功能的.如果要开wifi的话,必须是用网线连接才可以,通过wifi连接网络就不能开移动 ...

  8. SpringMVC重点知识总结

    SpringMVC总结 1. SpringMVC简介 MVC即模型-视图-控制器(Model-View-Controller) Spring Web MVC是一种基于Java的实现了Web MVC设计 ...

  9. fenby C语言 P23

    #include <stdio.h> int main(){ int i,max,a[5]={10,5,20,31,4}; max=a[0]; for(i=0;i<5;i++) if ...

  10. SpringCloud之Zuul过滤器实现登录鉴权实战(十一)

    自定义zuul过滤器实现登录鉴权实战 1.新建filter包 2.新建类继承ZuulFilter,重写方法 3.在类顶部加注解@Comment让spring扫描 /** * @author WGR * ...