pyzmq的4种模式(PUSH/PULL)笔记



   这个是 PUSH/PULL 模式,又叫做pipeline管道模式,取其一去不回头之意,一推一拉,数据滚滚向前。

   这种socket封装的原本用意呢,是把数据交给一组worker端干活,PUSH会把任务均匀的(这个好像是zmq的招牌)的分配给下游的worker们,保证大家都有活干,图:

伦理片 http://www.dotdy.com/


Producer:产生代处理数据,并将数据push出去

consumer(worker):pull到来自producer的数据,处理后,push出去

resultcolltor:pull到consumer的数据处理结果

Producer:

Python代码   收藏代码
  1. import time  
  2. import zmq  
  3.   
  4. def producer():  
  5.     context = zmq.Context()  
  6.     zmq_socket = context.socket(zmq.PUSH)  
  7.     zmq_socket.bind("tcp://127.0.0.1:5557")  
  8.     # 开始Producer之前必须先启动resultcollector和consumer  
  9.     for num in xrange(2000):  
  10.         work_message = { 'num' : num }  
  11.         zmq_socket.send_json(work_message)  
  12.   
  13. producer()  

 consumer:

Python代码   收藏代码
  1. import time  
  2. import zmq  
  3. import random  
  4.   
  5. def consumer():  
  6.     consumer_id = random.randrange(1,10005)  
  7.     print "I am consumer #%s" % (consumer_id)  
  8.     context = zmq.Context()  
  9.     # recieve work  
  10.     consumer_receiver = context.socket(zmq.PULL)  
  11.     consumer_receiver.connect("tcp://127.0.0.1:5557")  
  12.     # send work  
  13.     consumer_sender = context.socket(zmq.PUSH)  
  14.     consumer_sender.connect("tcp://127.0.0.1:5558")  
  15.       
  16.     while True:  
  17.         work = consumer_receiver.recv_json()  
  18.         data = work['num']  
  19.         result = { 'consumer' : consumer_id, 'num' : data}  
  20.         if data%2 == 0:   
  21.             consumer_sender.send_json(result)  
  22.   
  23. consumer()  

 resultcollector:

Python代码   收藏代码
  1. import time  
  2. import zmq  
  3. import pprint  
  4.   
  5. def result_collector():  
  6.     context = zmq.Context()  
  7.     results_receiver = context.socket(zmq.PULL)  
  8.     results_receiver.bind("tcp://127.0.0.1:5558")  
  9.     collecter_data = {}  
  10.     for x in xrange(1000):  
  11.         result = results_receiver.recv_json()  
  12.         if collecter_data.has_key(result['consumer']):  
  13.             collecter_data[result['consumer']] = collecter_data[result['consumer']] + 1  
  14.         else:  
  15.             collecter_data[result['consumer']] = 1  
  16.         if x == 999:  
  17.             pprint.pprint(collecter_data)  
  18.   
  19. result_collector()  

run起来:

Java代码   收藏代码
  1. python resultcollector.py  
  2. python consumer.py  
  3. python consumer.py  
  4. python producer.py  

Producer的2000个数交给consumer处理(就是排除奇数),然后汇集到resultcollector,看下结果:

Java代码   收藏代码
  1. {   3362233,  
  2.     9312767  
  3. }  

影音先锋电影 http://www.iskdy .com/ 

 consumer:3362 处理 233,consumer:9312 处理767,结果还行,呵呵

 注意一点就是,下游要先于上游开启,否则数据就丢了。感觉zmq对socket的这几种封装,有些场景还是挺适用,可以自由组装。有机会尝试一下。




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值