python zeromq 使用
Reference: http://blog.csdn.net/kwsy2008/article/details/49464663
本篇博客将介绍zmq应答模式,所谓应答模式,就是一问一答,规则有这么几条
1、 必须先提问,后回答
2、 对于一个提问,只能回答一次
3、 在没有收到回答前不能再次提问
上代码,服务端:
- #coding=utf-8
- '''''
- Created on 2015-10-10
- 回复请求
- @author: kwsy2015
- '''
- import zmq
- import time
- context = zmq.Context()
- socket = context.socket(zmq.REP)
- socket.bind('tcp://*:5555')
- while True:
- message = socket.recv()
- print 'received request: ' ,message
- time.sleep(1)
- socket.send('World')
客户端:
- #coding=utf-8
- '''''
- Created on 2015-10-10
- 你无法连续向服务器发送数据,必须发送一次,接收一次
- REQ和REP模式中,客户端必须先发起请求
- @author: kwsy2015
- '''
- import zmq
- context = zmq.Context()
- print 'connect to hello world server'
- socket = context.socket(zmq.REQ)
- socket.connect('tcp://localhost:5555')
- for request in range(1,10):
- print 'send ',request,'...'
- socket.send('hello')
- message = socket.recv()
- print 'received reply ',request,'[',message,']'
为了满足条件1,所以,客户端必须先接收问题,客户端总是必须先提问,客户端提问后,必须等待回答,在收到回答前如果又发出提问,那么会报错。
zmq.REP是应答方,zmq.REQ是提问方,显然,我们可以有多个提问方,但只能有一个提问方,这就好比正在学生正在上课,只能有一个老师来回答问题,可以有多个学生提问,老师只能一个问题一个问题的来回答,所以喽,必须是学生先提问,老师来回答,然后回答下一个学生的提问。
自问自答环节:
问题1: 应答方和提问方谁先启动呢?(服务端和客户端谁先启动呢?)
答: 谁先启动都可以,和pub/sub模式一样
问题2: 如果服务端断掉或者客户端断掉会产生怎样的影响?
答: 如果是客户端断掉,对服务端没有任何影响,如果客户端随后又重新启动,那么两方继续一问一答,但是如果是服务端断掉了,就可能会产生一些问题,这要看服务端是在什么情况下断掉的,如果服务端收是在回答完问题后断掉的,那么没影响,重启服务端后,双发继续一问一答,但如果服务端是在收到问题后断掉了,还没来得及回答问题,这就有问题了,那个提问的客户端迟迟得不到答案,就会一直等待答案,因此不会再发送新的提问,服务端重启后,客户端迟迟不发问题,所以也就一直等待提问。
问题3: 看代码,服务端根本就没去区分提问者是谁,如果有两个提问题的人,如何保证服务端的答案准确的发给那个提问的客户端呢?
答: 关于这一点,大家不必担心,zmq的内部机制已经做了保证,提问者必然只收到属于自己的答案,我们不必去操心zmq是怎么做到的,你只需关于业务本身即可。
现在,我们把服务端代码做修改
- #coding=utf-8
- '''''
- Created on 2015-10-15
- @author: kwsy2015
- '''
- import zmq
- import time
- context = zmq.Context()
- socket = context.socket(zmq.REP)
- socket.bind('tcp://*:5555')
- while True:
- message = socket.recv()
- print 'received request: ' ,message
- time.sleep(1)
- if message == 'hello':
- socket.send('World')
- else:
- socket.send('success')
写两个客户端
客户端1:
- #coding=utf-8
- '''''
- Created on 2015-10-15
- @author: kwsy2015
- '''
- import zmq
- context = zmq.Context()
- print 'connect to hello world server'
- socket = context.socket(zmq.REQ)
- socket.connect('tcp://localhost:5555')
- for request in range(1,10):
- print 'send ',request,'...'
- socket.send('hello')
- message = socket.recv()
- print 'received reply ',request,'[',message,']'
客户端2:
- #coding=utf-8
- '''''
- Created on 2015-10-15
- @author: kwsy2015
- '''
- import zmq
- context = zmq.Context()
- print 'connect to hello world server'
- socket = context.socket(zmq.REQ)
- socket.connect('tcp://localhost:5555')
- for request in range(1,10):
- print 'send ',request,'...'
- socket.send('ok')
- message = socket.recv()
- print 'received reply ',request,'[',message,']'
实际的运行结果如图:
不难看出,每个客户端都收到了只属于自己的答案
python zeromq 使用的更多相关文章
- 网络编程之python zeromq学习系列之一
简介: zeromq中间件,他是一个轻量级的消息中间件,传说是世界上最快的消息中间件,为什么这么说呢? 因为一般的消息中间件都需要启动消息服务器,但是zeromq这厮尽然没有消息服务器,他压根没有消息 ...
- linux 下 rpc python 实例之使用XML-RPC进行远程文件共享
这是个不错的练习,使用python开发P2P程序,或许通过这个我们可以自己搞出来一个P2P下载工具,类似于迅雷.XML-RPC是一个远程过程调用(remote procedure call,RPC)的 ...
- saltstack高效运维
saltstack高效运维 salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会 ...
- lunix salt 用法
红蜘蛛软件 c/s client : 学生端是客户端 ,装了红蜘蛛客户端-学生端 server端: 教师机 ,装了红蜘蛛软件-教师端 教师机,只能管理, 教师机和学生机,相互通信,相互知道的情 ...
- linux之master和minion
saltstack博客地址: https://www.cnblogs.com/pyyu/p/9465608.html在线yaml文件编写:http://www.bejson.com/validator ...
- 使用XML-RPC进行远程文件共享
这是个不错的练习,使用python开发P2P程序,或许通过这个我们可以自己搞出来一个P2P下载工具,类似于迅雷.XML-RPC是一个远程过程调用(remote procedure call,RPC)的 ...
- slatstack高效运维
一.简介 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. 二.诞生的背景 系统管理员日常会进行大量的重复性操作,例如安装软件, ...
- 自动化运维之saltstack的使用安装
SaltStack 简介 SaltStack是一个服务器基础架构集中化管理平台,具备配置管理.远程执行.监控等功能,基于Python语言实现,结合轻量级消息队列(ZeroMQ)与Python第三方模块 ...
- saltstack系列(二)——zmq应答模式
python zeromq介绍 1.ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议. 2.有自己的模式,不同于更底层的点对点通讯模式. 3.有比tcp协议更高一级的协议(当然 ...
随机推荐
- 【Spring】SpringMVC之异常处理
java中的异常分为两类,一种是运行时异常,一种是非运行时异常.在JavaSE中,运行时异常都是通过try{}catch{}捕获的,这种只能捕获显示的异常,通常项目上抛出的异常都是不可预见.那么我们能 ...
- Linux下使用Nexus搭建Maven私服
在开发过程中,有时候会使用到公司内部的一些开发包,显然把这些包放在外部是不合适的.另外,由于项目一直在开发中,这些内部的依赖可能也在不断的更新.可以通过搭建公司内部的Maven服务器,将第三方和内部的 ...
- Hadoop相关项目Hive-Pig-Spark-Storm-HBase-Sqoop
Hadoop相关项目Hive-Pig-Spark-Storm-HBase-Sqoop的相关介绍. Hive Pig和Hive的对比 摘要: Pig Pig是一种编程语言,它简化了Hadoop常见的工作 ...
- OpenCV 学习笔记03 边界框、最小矩形区域和最小闭圆的轮廓
本节代码使用的opencv-python 4.0.1,numpy 1.15.4 + mkl 使用图片为 Mjolnir_Round_Car_Magnet_300x300.jpg 代码如下: impor ...
- samba 服务器搭建
为了能在两台机器上共享代码,方便测试不同平台性能和搭建分布式的web server,今天耗费半天时间搭建一个samba服务器共享数据,要求开放写权限,但多次实验均告失败,最终在 鸟哥 的提醒下 检查发 ...
- [转]Greenplum的工作负载及资源管理
工作负载及资源管理 查询分析-查看EXPLAIN输出 EXPLAIN输出一个计划为节点组成的树 每个节点表示一个独立的操作 计划应该从下向上读,每个节点得到的记录向上传递 成本评估项: cost - ...
- 转:zTree树控件实战篇:针对多个下拉加载zTree树应该如何做出合理的配置
今天有一个zTree的朋友遇到一个非常棘手的问题,才研究zTree树控件两天就被上头催着看成果,很是苦恼.他面对的问题就是页面内多个地方需要下拉在其文本框下方加载zTree树,由于对zTree下拉加载 ...
- notepad++添加插件管理器
notepad++ 是一个很不错的文本编辑器,添加一些插件可以更好地使用. 首先需要使用插件管理器,最新版本的github地址是:https://github.com/bruderstein/nppp ...
- Python 的黏包问题
Client 端内的代码: #Author:BigBao #Date:2018/7/4 import socket import struct client=socket.socket(socket. ...
- influxdb 配置文件注释
### Welcome to the InfluxDB configuration file. # The values in this file override the default value ...