0MQ 事件驱动 以及 poller
底层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的更多相关文章
- Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程
Reactor事件驱动的两种设计实现:面向对象 VS 函数式编程 这里的函数式编程的设计以muduo为例进行对比说明: Reactor实现架构对比 面向对象的设计类图如下: 函数式编程以muduo为例 ...
- 0MQ底层队列设计
ypipe_t has a yqueue_t. pipe_t relates two ypipe(s).pipe_t就是0MQ框架内使用的底层队列. yqueue_t的设计目的. yqueue_t 的 ...
- C++ 事件驱动型银行排队模拟
最近重拾之前半途而废的C++,恰好看到了<C++ 实现银行排队服务模拟>,但是没有实验楼的会员,看不到具体的实现,正好用来作为练习. 模拟的是银行的排队叫号系统,所有顾客以先来后到的顺序在 ...
- Node学习笔记(二):事件驱动
接触Node,提得最多的可能就是回调,异步非阻塞处理,思前想后,JavaScript从前端语言过渡到服务器端,最大的劣势可能就是线程,当然这方面的不足现在也被慢慢弥补起来了(很多第三方的npm包可供下 ...
- IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)
上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动架构 Domin Event-领域事件 Long-Runni ...
- ZeroMQ接口函数之 :zmq - 0MQ 轻量级消息传输内核
官方网址:http://api.zeromq.org/4-0:zmq zmq(7) 0MQ Manual - 0MQ/3.2.5 Name zmq – ØMQ 轻量级消息传输内核 Synopsis # ...
- 输入事件驱动---evdev_handler的大致实现流程(修整版)
一.input输入子系统框架 下 图是input输入子系统框架,输入子系统由输入子系统核心层(input core),驱动层和事件处理层(Event Handler)三部分组成.一个输入事件,比如滑动 ...
- NodeJS中的异步I/O、事件驱动
nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...
- 事件驱动之Twsited异步网络框架
在这之前先了解下什么是事件驱动编程 传统的编程是如下线性模式的: 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结 ...
随机推荐
- 全面认识nslookup命令及子命令
- windows 抓hash获取管理员密码
webshell 找能执行权限的目录上传 C:\Windows\System32\config\sam 内有windows 密码 利用工具把密码抓出来 samcopy 直接抓取 GetHASHES.e ...
- 在已有 Windows10 系统的基础上,安装 Ubuntu17.10 系统(新版 BIOS)
1.第一步,下载Ubuntu系统镜像 2.第二步,制作启动U盘,使用UltralSO,步骤:打开文件——选择iso文件——启动——写入硬盘映像——选择U盘——写入 3.第三步,分区,在Windows徽 ...
- Qt 表格的使用
参考 http://doc.qt.io/qt-5/qtablewidget.html http://doc.qt.io/qt-5/qtablewidgetitem.html https://blog. ...
- 百万年薪python之路 -- 函数的动态参数
1.函数的动态参数 1.1 动态接收位置参数 在参数位置用*表示接受任意参数 def eat(*args): print('我想吃',args) eat('蒸羊羔','蒸熊掌','蒸鹿尾儿','烧花鸭 ...
- PassWord控件
<StackPanel Margin="> <Label>Text:</Label> <TextBox /> <Label>Pas ...
- SpringBoot学习(二)探究Springboot启动机制
引言: SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起探究一下SpringBoot的启动原 ...
- Spark执行流程(转)
原文地址:http://blog.jobbole.com/102645/ 我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程.根据你使 ...
- unity发布ios高通AR的问题
1)缺少引用,无法找到vuforiaBehavior 原因:Windows下的工程,直接考到mac下,导致unity自带插件(2017)有问题 解决:首先在playerSettings-xrSetti ...
- Spring中@Resource注解报错
描述:Spring框架中,@Resource注解报错,在书写时没有自动提示 解决方法:因为maven配置文件的pom.xml文件中缺少javax.annotation的依赖,在pom.项目路中加入依赖 ...