底层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是不支持多线程的。

转载于:https://www.cnblogs.com/bbqzsl/p/7526209.html

0MQ 事件驱动 以及 poller相关推荐

  1. golang-实现自己的事件驱动

    golang实现自己的事件驱动 众所周知,go中的异步操作都已经封装在了运行时的过程中,有关socket的网络的异步操作都封装到了go的netpoll中,从而简化了编程形式.本文也就根据evio库总结 ...

  2. muduo网络库学习(八)事件驱动循环线程池EventLoopThreadPool

    muduo是支持多线程的网络库,在muduo网络库学习(七)用于创建服务器的类TcpServer中也提及了TcpServer中有一个事件驱动循环线程池,线程池中存在大量线程,每个线程运行一个Event ...

  3. muduo网络库学习(四)事件驱动循环EventLoop

    muduo的设计采用高并发服务器框架中的one loop per thread模式,即一个线程一个事件循环. 这里的loop,其实就是muduo中的EventLoop,所以到目前为止,不管是Polle ...

  4. muduo网络库学习(一)对io复用的封装Poller,面向对象与基于对象

    高效并发的网络框架大多离不开io多路复用函数,Linux下有三种 select poll epoll 关于三者的区别可以参考 linux网络编程-–几种服务器模型及io多路复用函数 前段时间看Libe ...

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

    内容目录: Reactor实现架构对比 面向对象的Reactor方案设计 函数式编程的Reactor设计 示例对比 两者的时序图对比 结论 Reactor事件驱动的两种设计实现:面向对象 VS 函数式 ...

  6. 由Node.js事件驱动模型引发的思考

    引言 近段时间听说了Node.js,很多文章表述这个事件驱动模型多么多么优秀,应用在服务器开发中有很大的优势,本身对此十分感性去,决定深入了解一下,由此也引发了一些对程序设计的思考,记录下来. 什么是 ...

  7. 微服务系列(五):事件驱动的数据管理

    编者的话|本文来自 Nginx 官方博客,是「Chris Richardson 微服务」系列的第五篇文章.第一篇文章介绍了微服务架构模式,并且讨论了使用微服务的优缺点:第二和第三篇描述了微服务架构模块 ...

  8. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 1 简单的启动线程语法 2 def run(na ...

  9. 网关技术选型,为什么选择 Openresty ?事件驱动、协程...

    今天跟大家聊下关于网关的话题 互联网公司,不论体量大小如何,其内部的技术架构基本都是相似的,体现在以下几个方面: 数据量过大,如何定制化存储 访问量高了,如何集群化部署,流量负载均衡 响应速度慢了,如 ...

最新文章

  1. [转] 中国的车祸为什么多?一个”海归”的亲身体验(转)
  2. 计算机网络-TCP运输连接管理
  3. Web性能优化:What? Why? How?
  4. tiny4412的烧录工具minitool安装【学习笔记】
  5. 布袋除尘器过滤风速多少_滤筒除尘器的过滤风速如何选择?不会的进来看
  6. FPGA _Verilog HDL_8位加法器设计实验
  7. Kotlin入门(12)类的概貌与构造
  8. 软件工程~数据字典例子解释
  9. word文档打印表格时预览时看的到表格打印出来的表格没有上下两根横线?
  10. 360视频:二十面体投影ISP
  11. TCP四次挥手中的2MSL是什么?
  12. Java 中的 String、StringBuffer、StringBuilder
  13. 论文笔记 Question Answering over Freebase via Attentive RNN with Similarity Matrix based CNN
  14. 周六研易01:深入研究甲木选用法
  15. PAT乙级——1010.月饼
  16. 利用逆矩阵简化矩阵多项式
  17. Python实战:如何隐藏自己的爬虫身份
  18. flash在线拍照并上传到后台(servlet)
  19. C#对磁盘路径字符串的相关操作
  20. centos 7 中文输入法的安装和启用

热门文章

  1. Android开发笔记(一百二十二)循环器视图RecyclerView
  2. java 栈队列区别是什么意思_java栈和队列的区别
  3. java面试-JVM调优和参数配置
  4. 改造create-react-app 通过npm命令动态打包文件
  5. 在命令行启动vscode
  6. 全息营销话题提纲(2-1)--王甲佳全息营销系列15
  7. 中国正在发生或可能发生的变化,将影响未来
  8. 资源字典——程序集之间的资源共享
  9. android下测试方法及junit单元测试框架配置方法
  10. bash内部命令-1