如果你是希望通过0MQ来做缓冲队列,非阻塞的效果,那你就必须清楚 0MQ Socket是会阻塞,你要搞清楚0MQ Socket与队列的关系。

官方协议文档规定了,一部分类型的 0MQ Socket为不阻塞发送,而另一部分类型则是阻塞发送的。不阻塞发送同时往往也意味着丢弃消息,相反不能丢弃消息的则要求阻塞发送。这里的阻塞发送,不是说像tcp那样确保送到目的地,而是必须有目的地可以发送。而队列的作用就是架在发送端和目的地之间作缓冲。如果连目的地也没有,那么队列也就失去存在的意义了,所以只好将发送阻塞起来。到这里你可能会撇嘴,不是发送端缓冲在队列,在接收端建立起连接后,接收端从队列中取消息。这是你相像出来的 0MQ,而非人家设计出来 0MQ。还是要看人家的(协议设计)文档。

各种类型的详细行为责任定义:

The PAIR Socket Type

  • SHALL create a double queue when initiating an outgoing connection to a peer, and SHALL maintain the double queue whether or not the connection is established.
  • SHALL create a double queue when a peer connects to it. If this peer disconnects, the PAIR socket SHALL destroy its double queue and SHALL discard any messages it contains.

The PULL Socket Type

  • SHALL create this queue when initiating an outgoing connection to a peer, and SHALL maintain the queue whether or not the connection is established.
  • SHALL create this queue when a peer connects to it. If this peer disconnects, the PULL socket SHALL destroy its queue and SHALL discard any messages it contains.

The PUSH Socket Type

  • SHALL create this queue when initiating an outgoing connection to a peer, and SHALL maintain the queue whether or not the connection is established.
  • SHALL create this queue when a peer connects to it. If this peer disconnects, the PUSH socket SHALL destroy its queue and SHALL discard any messages it contains.

从上面一般行为规定可以看到,队列是与底层socket连接对应的,当底层没有任何socket连接时,队列就不存在。所以发送行为就有下面这样的规定。

The PAIR Socket Type

  • SHALL consider its peer as available only when it has a outgoing queue that is not full.
  • SHALL block on sending, or return a suitable error, when it has no available peer.
  • SHALL not accept further messages when it has no available peer.
  • SHALL NOT discard messages that it cannot queue.

The PUSH Socket Type

  • SHALL consider a peer as available only when it has a outgoing queue that is not full.
  • SHALL route outgoing messages to available peers using a round-robin strategy.
  • SHALL block on sending, or return a suitable error, when it has no available peers.
  • SHALL not accept further messages when it has no available peers.
  • SHALL NOT discard messages that it cannot queue.

The DEALER Socket Type

  • SHALL consider a peer as available only when it has a outgoing queue that is not full.
  • SHALL route outgoing messages to available peers using a round-robin strategy.
  • SHALL block on sending, or return a suitable error, when it has no available peers.
  • SHALL not accept further messages when it has no available peers.
  • SHALL NOT discard messages that it cannot queue.

The REQ Socket Type

  • SHALL prefix the outgoing message with an empty delimiter frame.
  • SHALL route outgoing messages to connected peers using a round-robin strategy.
  • SHALL block on sending, or return a suitable error, when it has no connected peers.
  • SHALL NOT discard messages that it cannot send to a connected peer.

1. 红色字眼 block on,说明了 0MQ Socket 在发送过程有可以阻塞。

2. ”consider a peer as available only when it has a outgoing queue that is not full“, 特别要注意peer,首先要有连接,只要这个连接关联的发送队列不满也就可以视作可以发送。

3. "block on sending, or return a suitable error, when it has no connected/available peers", 当没有可以发送的peer,(意思是a. 有连接但发送队列满;b. 无任何连接,也就没有队列了。)要么阻塞发送,要么就返回错误给调用者,由调用者自己决定丢弃消息或其它方式处理。

4. "not accept further messages when it has no available peers",这里是指 0MQ Socket 层不接受 0MQ Socket使用者发送的消息,不是说底层连接不接收消息。

现在是否清楚使用 0MQ时,在什么情况下可能会被阻塞了。

0MQ是会阻塞的,不要字面上看到队列就等同非阻塞。的更多相关文章

  1. (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别

    阻塞队列:线程安全 按 FIFO(先进先出)排序元素.队列的头部 是在队列中时间最长的元素.队列的尾部 是在队列中时间最短的元素.新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素.链接 ...

  2. Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器

    本文无太多内容,主要是几个前面提到过的注意点: 一是epoll的fd需要重新装填.我们将tcp_connection_t的指针保存在数组中,所以我们以这个数组为依据,重新装填fd的监听事件. //重新 ...

  3. 008. 阻塞&非阻塞、同步&异步

    阻塞 非阻塞:关注的对象是调用者: 阻塞:调用者发起调用后,处于等待状态,直到该调用有返回: 非阻塞:调用者发起调用后,不需要等待返回,可以往下执行: 同步 异步:  关注的对象是被调用者: 同步:服 ...

  4. IO模型浅析-阻塞、非阻塞、IO复用、信号驱动、异步IO、同步IO

    最近看到OVS用户态的代码,在接收内核态信息的时候,使用了Epoll多路复用机制,对其十分不解,于是从网上找了一些资料,学习了一下<UNIX网络变成卷1:套接字联网API>这本书对应的章节 ...

  5. EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接

    EAGAIN.EWOULDBLOCK.EINTR与非阻塞 长连接 EWOULDBLOCK用于非阻塞模式,不需要重新读或者写 EINTR指操作被中断唤醒,需要重新读/写 在Linux环境下开发经常会碰到 ...

  6. 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?

    “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...

  7. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  8. socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  9. socket阻塞与非阻塞,同步与异步

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...

随机推荐

  1. Shiro权限管理框架(四):深入分析Shiro中的Session管理

    其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...

  2. Unity常用协程功能封装

    # 1.前言unity开发过程中,经常用到一些特定的协程功能,比如延时触发.等待触发.重复操作等.unity自带Invoke以及InvokeRepeating方法,但这些方法均采用反射机制,性能消耗, ...

  3. C#控件的简单应用

    listview 创建columns: ImageList imgList = new ImageList(); imgList.ImageSize = , ); FaceListview.Small ...

  4. Java IO编程——字符流与字节流

    在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...

  5. fenby C语言 P28

    #include <stdio.h> int main(){ int *p1,*p2,a=10,b=20,c; p1=&a; p2=&b; if(a<b) { c=a ...

  6. 如何让OKR实践变得更简单一些

    什么是OKR 近几年OKR的概念在国内开始流行起来了,之前公司也有人想实施OKR,但现在看来之前的OKR实施者只是在哪儿看了一下OKR的资料,本着跟老板邀功的想法比较功利的在推进,所以基本没有效果,今 ...

  7. [UWP]使用GetAlphaMask和ContainerVisual制作长阴影(Long Shadow)

    1. 什么是长阴影 前几年扁平化设计(Flat Design)十分流行,后来在扁平化的基础上又流行起了长阴影(Long Shadow).长阴影其实就是扩展了对象的投影,感觉是一种光线照射下的影子,通常 ...

  8. Bigo的Java面试,我挂在了第三轮技术面上.........

    背景 前段时间家里出了点事,辞职回家待了一段时间,处理完老家的事情后就回到广州这边继续找工作,大概是国庆前几天我去面试了一家叫做Bigo(YY的子公司),面试的职位是面向3-5年的Java开发,最终自 ...

  9. C/C++ return *this和return this的区别

    首先我们知道~ class Test { public: Test() { return this; //返回的当前对象的地址 } Test&() { return *this; //返回的是 ...

  10. 文件I/O——文件打开函数(open/openat)

    一.open函数 1.函数原型:int open(const char *path,int oflag,.../* mode_t mode */); 2.头文件:#include <fcntl. ...