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,也就 ...
随机推荐
- std::hash实现太简单分布不匀
std::hash实现太简单分布不匀(金庆的专栏 2017.5)#include <iostream>#include <functional>using namespace ...
- [置顶]
【机器学习PAI实践六】金融贷款发放预测
一.背景 很多农民因为缺乏资金,在每年耕种前会向相关机构申请贷款来购买种地需要的物资,等丰收之后偿还.农业贷款发放问题是一个典型的数据挖掘问题.贷款发放人通过往年的数据,包括贷款人的年收入.种植的作物 ...
- struts2.5框架使用通配符指定方法,某一个匹配不到
在学习struts框架时经常会使用到通配符调用方法,如下:但奇怪的是,在validateName请求老报404,其他的都是ok的,开始以为是配置错了,检查好久才知道: <action name= ...
- 转载:TCP连接的状态详解以及故障排查
FROM:http://blog.csdn.net/hguisu/article/details/38700899 该博文的条理清晰,步骤明确,故复制到这个博文中收藏,若文章作者看到且觉得不能装载,麻 ...
- HDU - 5936: Difference(暴力:中途相遇法)
Little Ruins is playing a number game, first he chooses two positive integers yy and KK and calculat ...
- Hibernate HQL查询(2)
hql是面向对象查询,格式:from + 类名 + 类对象 + where + 对象的属性 sql是面向数据库表查询,格式:from + 表名 + where + 表中字段 1.查询 一般在Hiber ...
- 洛谷 P2920 [USACO08NOV]时间管理Time Management
传送门 题目大意: 每个工作有截至时间和耗费时间,n个工作求最小开始时间. 题解: 贪心 从n-1安排,让结束时间尽量的晚. 注意:优先级 cout<<st<0?-1:st; (X ...
- CSS设计取消a标签的修饰,转为文本
用法:text-decoration:none;修饰:text-decoration的用法:http://www.runoob.com/cssref/pr-text-text-decoration.h ...
- c#同步調用異步(async)方法【記錄用】
使用RestSharp中的異步方法ExecuteTaskAsync<T>編寫寫了一個異步方法,功能很簡單:異步調用API,返回結果,假設為GetAccessToken,方法簽名假設如下: ...
- weblogic控制台的启动与禁用
在一些安全漏洞扫描中,经常会扫描发现,使用weblogic管理控制台,会有个中危的漏洞. http://192.168.10.46:7001/console/login/LoginForm.jsp W ...