Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4455186
  • 博文数量: 1214
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 9105
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1214)

文章存档

2021年(13)

2020年(49)

2019年(14)

2018年(27)

2017年(69)

2016年(100)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: 网络与安全

2012-09-06 15:04:43

文章来源:http://iyuan.iteye.com/blog/974513
之前已经讲过,zeroMQ是可以多对多的,但需要成对匹配才行,即多个发布端都是同一种模式,而这里要涉及到的是,多个发布端模式不统一的情况。

文中先给出了一个比较"脏"的处理方式:
Python代码  收藏代码
  1. import zmq  
  2. import time  
  3.   
  4. context = zmq.Context()  
  5.   
  6. receiver = context.socket(zmq.PULL)  
  7. receiver.connect("tcp://localhost:5557")  
  8.   
  9. subscriber = context.socket(zmq.SUB)  
  10. subscriber.connect("tcp://localhost:5556")  
  11. subscriber.setsockopt(zmq.SUBSCRIBE, "10001")  
  12.   
  13. while True:  
  14.   
  15.     while True:  
  16.         try:  
  17.             rc = receiver.recv(zmq.NOBLOCK)#这是非阻塞模式  
  18.         except zmq.ZMQError:  
  19.             break  
  20.   
  21.     while True:  
  22.         try:  
  23.             rc = subscriber.recv(zmq.NOBLOCK)  
  24.         except zmq.ZMQError:  
  25.             break  


显然,如此做既不优雅,还有出现单来源循环不止,另一来源又得不到响应的状况。

自然,官方也做了相应的封装,给了一个相对优雅的实现:
Python代码  收藏代码
  1. import zmq  
  2.   
  3. context = zmq.Context()  
  4.   
  5. receiver = context.socket(zmq.PULL)  
  6. receiver.connect("tcp://localhost:5557")  
  7.   
  8. subscriber = context.socket(zmq.SUB)  
  9. subscriber.connect("tcp://localhost:5556")  
  10. subscriber.setsockopt(zmq.SUBSCRIBE, "10001")  
  11.   
  12. poller = zmq.Poller()  
  13. poller.register(receiver, zmq.POLLIN)  
  14. poller.register(subscriber, zmq.POLLIN)  
  15.   
  16. while True:  
  17.     socks = dict(poller.poll())  
  18.   
  19.     if receiver in socks and socks[receiver] == zmq.POLLIN:  
  20.         message = receiver.recv()  
  21.   
  22.     if subscriber in socks and socks[subscriber] == zmq.POLLIN:  
  23.         message = subscriber.recv()  


这种方式采用了平衡兼顾的原则,实现了类似于同一模式多发布端推送的"平衡队列"功能。

(未完待续)
阅读(2348) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~