python zeromq介绍

  1、ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议。

  2、有自己的模式,不同于更底层的点对点通讯模式。

  3、有比tcp协议更高一级的协议(当然ZeroMQ不一定基于TCP协议,它也可以用于进程间和进程内通讯)。

  4、改变了通讯都基于一对一的连接这个假设。

zeromq通讯模型

  1、请求应答模型

  由请求端发起请求,并等待回应端回应请求。从请求端来看,一定是一对对收发配对的;反之,在回应端一定是发收对。请求端和回应端都可以是1:N的模型。通常把1认为是server,N认为是Client。0MQ可以很好的支持路由功能(实现路由功能的组件叫做Device),把1:N扩展为N:M(只需要加入若干路由节点)。从这个模型看,更底层的端点地址是对上层隐藏的。每个请求都隐含回应地址,而应用则不关心它。

  2、发布订阅模型

  这个模型里,发布端是单向只发送数据的,且不关心是否把全部的信息都发送给订阅者。如果发布端开始发布信息的时候,订阅端尚未连接上,这些信息直接丢弃。不过一旦订阅连接上来,中间会保证没有信息丢失。同样,订阅端则只负责接收,而不能反馈。如果发布端和订阅端需要交互(比如要确认订阅者是否已经连接上),则使用额外的socket采用请求回应模型满足这个需求。

  3、管道模型

  这个模型里,管道是单向的,从PUSH端单向的向PULL端单向的推送数据流。

zeromq请求应答模型

  应答模式,就是一问一答,规则有这么几条:

   1、 必须先提问,后回答

2、 对于一个提问,只能回答一次

3、 在没有收到回答前不能再次提问

上代码,服务端: 

#coding=utf-8  

import zmq
import time context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind('tcp://127.0.0.1:8000') while True:
message = socket.recv()
print 'received request: ' ,message time.sleep(1)
socket.send('World')

客户端:

#coding=utf-8
'''''
你无法连续向服务器发送数据,必须发送一次,接收一次
REQ和REP模式中,客户端必须先发起请求 '''
import zmq context = zmq.Context()
print 'connect to hello world server'
socket = context.socket(zmq.REQ)
socket.connect('tcp://127.0.0.1:8000') for request in range(1,10):
print 'send ',request,'...'
socket.send('hello')
message = socket.recv()
print 'received reply ',request,'[',message,']'

说明:

  客户端总是必须先提问,客户端提问后,必须等待回答,在收到回答前如果又发出提问,那么会报错。  

  zmq.REP是应答方,zmq.REQ是提问方,显然,我们可以有多个提问方,但只能有一个提问方。

问答环节

问题1:应答方和提问方谁先启动呢?(服务端和客户端谁先启动呢?)

答:谁先启动都可以,和pub/sub模式一样

问题2:如果服务端断掉或者客户端断掉会产生怎样的影响?

答:如果是客户端断掉,对服务端没有任何影响,如果客户端随后又重新启动,那么两方继续一问一答,但是如果是服务端断掉了,就可能会产生一些问题,这要看服务端是在什么情况下断掉的,如果服务端是在回答完问题后断掉的,那么没影响,重启服务端后,双发继续一问一答,但如果服务端是在收到问题后断掉了,还没来得及回答问题,这就有问题了,那个提问的客户端迟迟得不到答案,就会一直等待答案,因此不会再发送新的提问,服务端重启后,客户端迟迟不发问题,所以也就一直等待提问。

问题3: 看代码,服务端根本就没去区分提问者是谁,如果有两个提问题的人,如何保证服务端的答案准确的发给那个提问的客户端呢?

答:关于这一点,大家不必担心,zmq的内部机制已经做了保证,提问者必然只收到属于自己的答案,我们不必去操心zmq是怎么做到的,你只需关于业务本身即可。

现在,我们把服务端代码做修改

#coding=utf-8  

import zmq
import time context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind('tcp://127.0.0.1:8000') while True:
message = socket.recv()
print 'received request: ' ,message
time.sleep(1)
if message == 'hello':
socket.send('World')
else:
socket.send('success')

服务端

#coding=utf-8  

import zmq  

context = zmq.Context()
print 'connect to hello world server'
socket = context.socket(zmq.REQ)
socket.connect('tcp://127.0.0.1:8000') for request in range(1,10):
print 'send ',request,'...'
socket.send('hello')
message = socket.recv()
print 'received reply ',request,'[',message,']'

客户端1

#coding=utf-8  

import zmq  

context = zmq.Context()
print 'connect to hello world server'
socket = context.socket(zmq.REQ)
socket.connect('tcp://127.0.0.1:8000') for request in range(1,10):
print 'send ',request,'...'
socket.send('ok')
message = socket.recv()
print 'received reply ',request,'[',message,']'

客户端2

实际的运行结果如图:

不难看出,每个客户端都收到了只属于自己的答案

saltstack系列(二)——zmq应答模式的更多相关文章

  1. saltstack系列(六)——zmq扩展(二)

    问题 我们已经熟练的掌握了REQ/REP模式,它是一个一对多的模式,一个REP对应多个REQ. 但是现实工作中,我们会遇到这样的难题,一个REP无法满足REQ的提问,因为REQ太多了,虽然可以增加一个 ...

  2. saltstack系列(四)——zmq Paraller Pipeline模式

    push/pull模式 push/pull模式,这是一个什么模式呢?战争时期,食物紧缺,实行配给制,大家都排好队,有人专门发放食物,前一个人领取了食物,后一个人跟上继续领取食物,这个push端就是发放 ...

  3. saltstack系列(三)——zmq订阅/发布模式

    zmq订阅发布模式 server端代码: #coding=utf-8 ''''' 服务端,发布模式 ''' import zmq from random import randrange contex ...

  4. saltstack系列(五)——zmq扩展(一)

    问题 假设我们的一个客户端既有pull又有sub,他们两个都需要接收消息,该如何协调呢,毕竟,当一个socket要收消息的时候,函数recv是阻塞的,所以,我们第一个思路是不让它阻塞? 实例代码: # ...

  5. Java 设计模式系列(十二)策略模式(Strategy)

    Java 设计模式系列(十二)策略模式(Strategy) 策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以 ...

  6. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  7. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

  8. Web 前端开发人员和设计师必读文章推荐【系列二十八】

    <Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

  9. Web 开发精华文章集锦(jQuery、HTML5、CSS3)【系列二十七】

    <Web 前端开发精华文章推荐>2014年第6期(总第27期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...

随机推荐

  1. Tinker爬坑之路

    目的 热修复去年年底出的时候,变成了今年最火的技术之一.依旧记得去年面试的时候统一的MVP,然而今年却变成了RN,热修复.这不得不导致我们需要随时掌握最新的技术.不然可能随时会被淘汰.记得刚进公司,技 ...

  2. canvas 绘制文本

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. Centos 6.3 Realtek Audio Driver Compile

    /**************************************************************************** * Centos 6.3 Realtek A ...

  4. kali视频学习(6-10)

    第三周 kali视频(6-10)学习 6.信息搜集之主机探测 7.信息搜集之主机扫描(nmap使用) 8.信息搜集之指纹识别 9.信息搜集之协议分析 10.漏洞分析之OpenVAS安装 6.信息搜集之 ...

  5. Ubantu中安装sublime

    Sublime-text-3的安装步骤   添加Sublime-text-3软件包的软件源 sudo add-apt-repository ppa:webupd8team/sublime-text-3 ...

  6. python 函数名,闭包

    1.函数名字的应用 函数名是什么? 函数名是函数的名字,本质:变量,特殊变量 函数名+() ———>执行此函数: 2.函数名的赋值: def func2(): print(44) f = fun ...

  7. spring mvc集成freemarker使用

    freemarker作为视图技术出现的比velocity早,想当年struts风靡一时,freemarker作为视图层也风光了一把.但现在velocity作为后起之秀的轻量级模板引擎,更容易得到青睐. ...

  8. ADO连接ACCESS数据库

    首先在StdAfx.h中加入 建立连接:(在xxApp文件中) 1  声明变量 2 建立连接 (1) AfxOleInit 初始化 OLE 为应用程序的支持. BOOL AFXAPI AfxOleIn ...

  9. GitFlow在命令行的使用

    gitflow安装 在命令行直接使用yum安装 yum install gitflow 如果本地的yum源中不存在gitflow,可以尝试添加EPEL源 CentOS6.5: # 下载 wget ht ...

  10. 【转】 Pro Android学习笔记(九一):了解Handler(5):组件生命

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 对于activity,消息是在OnCrea ...