saltstack系列(五)——zmq扩展(一)
问题
假设我们的一个客户端既有pull又有sub,他们两个都需要接收消息,该如何协调呢,毕竟,当一个socket要收消息的时候,函数recv是阻塞的,所以,我们第一个思路是不让它阻塞?
实例代码:
#coding=utf-8
'''''
在这里,同时处理多个套接字,那么接收消息的时候,就需要设置noblock
不然会在第一个接收消息的地方堵塞
'''
import zmq
import time # Prepare our context and sockets
context = zmq.Context() # Connect to task ventilator
receiver = context.socket(zmq.PULL)
receiver.connect("tcp://localhost:8000") # Connect to weather server
subscriber = context.socket(zmq.SUB)
subscriber.connect("tcp://localhost:8001")
subscriber.setsockopt(zmq.SUBSCRIBE, b"10001") # Process messages from both sockets
# We prioritize traffic from the task ventilator
while True: # Process any waiting tasks
while True:
try:
#用了NOBLOCK,就意味着得不到消息时不会堵塞在这里
msg = receiver.recv(zmq.NOBLOCK)
except zmq.ZMQError:
break
# process task # Process any waiting weather updates
while True:
try:
msg = subscriber.recv(zmq.NOBLOCK)
except zmq.ZMQError:
break
# process weather update # No activity, so sleep for 1 msec
time.sleep(0.001)
通过设置zmq.NOBLOCK,我们可以让recv不再阻塞,但是呢,要捕捉zmq.ZMQError这个异常,这样一来,两个套接字就可以不发生冲突了。
但是明显,你可以感受得到,这种做法的丑陋,看起来不是那么的优雅,所以我们换一种做法。
#coding=utf-8
'''''
这种方式比msreader要更好一些
'''
import zmq # Prepare our context and sockets
context = zmq.Context() # Connect to task ventilator
receiver = context.socket(zmq.PULL)
receiver.connect("tcp://localhost:8000") # Connect to weather server
subscriber = context.socket(zmq.SUB)
subscriber.connect("tcp://localhost:8001")
subscriber.setsockopt(zmq.SUBSCRIBE, b"10001") # Initialize poll set
poller = zmq.Poller()
poller.register(receiver, zmq.POLLIN)
poller.register(subscriber, zmq.POLLIN) # Process messages from both sockets
while True:
try:
socks = dict(poller.poll())
except KeyboardInterrupt:
break if receiver in socks:
message = receiver.recv()
# process task if subscriber in socks:
message = subscriber.recv()
# process weather update
这种做法就很想socket的select模式,大家谁也别争,谁也别抢,只要有消息达到,我就通知你们,然后你们各自检查是不是自己的消息。我们在客户端创建多个socket套接字可能是合理的,但是服务端就最好别这么做了,REQ,PUSH,PUB,道理其实也很简单,服务就是服务,多个员工可以挤在一个办公司里办公,哪有多个老板挤在一起办公的。
saltstack系列(五)——zmq扩展(一)的更多相关文章
- saltstack系列(六)——zmq扩展(二)
问题 我们已经熟练的掌握了REQ/REP模式,它是一个一对多的模式,一个REP对应多个REQ. 但是现实工作中,我们会遇到这样的难题,一个REP无法满足REQ的提问,因为REQ太多了,虽然可以增加一个 ...
- saltstack系列(二)——zmq应答模式
python zeromq介绍 1.ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议. 2.有自己的模式,不同于更底层的点对点通讯模式. 3.有比tcp协议更高一级的协议(当然 ...
- saltstack系列(四)——zmq Paraller Pipeline模式
push/pull模式 push/pull模式,这是一个什么模式呢?战争时期,食物紧缺,实行配给制,大家都排好队,有人专门发放食物,前一个人领取了食物,后一个人跟上继续领取食物,这个push端就是发放 ...
- saltstack系列(三)——zmq订阅/发布模式
zmq订阅发布模式 server端代码: #coding=utf-8 ''''' 服务端,发布模式 ''' import zmq from random import randrange contex ...
- Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图
Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...
- SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...
- C语言高速入门系列(五)
C语言高速入门系列(五) C语言指针初涉 ------转载请注明出处:coder-pig 本节引言: 上一节我们对C ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- Netty4.x中文教程系列(五)编解码器Codec
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...
随机推荐
- H5 项目问题总结
//一.HTML页面结构 <meta name="viewport" content="width=device-width,initial-scale=1.0,m ...
- stringstream 用法
stringstream stringstream 是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的 iostream.fstream 有类似的操作方式.要使用 stringst ...
- 用eclipse来制作并使用可执行的jar文件
我近来用java写了一个股票收益分析的小程序,用于计算我的股票操作所带来的的收益.这里,记录了如何将源代码打包成可执行的命令的一个过程. 1:生成可执行的jar文件 选中工程,选择菜单中的export ...
- 《C#求职宝典》读书笔记
王小科 电子工业出版 第一篇 面试求职第一步 一个例子:一支行军中的队伍长100米,一个传令兵从队尾跑至队头,再立即返回队尾,队伍正好前进了100米.假设队伍 和传令兵行进的速度恒定,问传令兵跑了多少 ...
- LeetCode Kill Process
原题链接在这里:https://leetcode.com/problems/kill-process/description/ 题目: Given n processes, each process ...
- spring源码学习之:项目公共配置项解决方案
一:项目中有一些key,value的简单配置 org.apache.commons.configuration.DatabaseConfiguration可以轻松解决 二:配置项目的xml中bean ...
- 洛谷P3585 [POI2015]PIE
传送门 题目大意:有个n*m的格子图,要求'x'点要被染成黑色 有个a*b的印章,'x'是可以染色的印章上的点. 要求用印章去染色格子 (1)印章不可以旋转. (2)不能把墨水印到纸外面. (3)纸上 ...
- IBM Cognos 10.2 最新体验之旅
IBM Cognos Data Manager 数据集市的构建利器 本文详细的介绍了 Cognos 最新版本 10.2 的数据集市构建器 Data Manager 的使用,对于希望系统了解 Cogno ...
- 非常好用的css代码格式化工具
http://tool.lanrentuku.com/cssformat/ 可以横向排列和竖向排列,感谢互联网,让我找到你了.
- 对实体 "useSSL" 的引用必须以 ';' 分隔符结尾。
<property name="connection.url">jdbc:mysql://127.0.0.1/cache?useUnicode=true&cha ...