pyzmq的4种模式(PUB/SUB)笔记


  • 博客分类: 

    Pub/Sub pattern  发布/订阅模式

发布订阅模式:发布方不用管理发布给哪个订阅方(看到这句话感觉不太好),有2种场景

 

场景2比较常见,多客户端向一个服务端订阅,场景1类似与REP/REQ的多服务器模式,避免单个PUB撑不住,(2个PUB的数据都能收到)

pub-server.py

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

Python代码   收藏代码
  1. port = '5556'  
  2. pub_server_name = 'pub-server01'  
  3.   
  4. context = zmq.Context()  
  5. socket = context.socket(zmq.PUB)  
  6. socket.bind('tcp://*:%s'%port)  
  7.   
  8. while True:  
  9.     topic = random.randrange(9999,10005)  
  10.     messagedata = random.randrange(1,215)-80  
  11.     print 'topic:%s messagedata:%s'%(topic,messagedata)  
  12.     socket.send('%d %d %s'%(topic,messagedata,pub_server_name))  
  13.     time.sleep(1)  

 随机发送主题为9999-10005的数据

sub-client.py

Python代码   收藏代码
  1. #coding=utf-8  
  2.   
  3. import sys  
  4. import zmq  
  5.   
  6. port = "5556"  
  7. if len(sys.argv) > 1:  
  8.     port =  sys.argv[1]  
  9.     int(port)  
  10.       
  11. if len(sys.argv) > 2:  
  12.     port1 =  sys.argv[2]  
  13.     int(port1)  
  14.   
  15. # Socket to talk to server  
  16. context = zmq.Context()  
  17. socket = context.socket(zmq.SUB)  
  18.   
  19. print "Collecting updates from weather server..."  
  20. socket.connect ("tcp://localhost:%s" % port)  
  21.   
  22. if len(sys.argv) > 2:  
  23.     socket.connect ("tcp://localhost:%s" % port1)  
  24.   
  25. # 本地过滤  
  26. topicfilter = "10001"  
  27. socket.setsockopt(zmq.SUBSCRIBE, topicfilter)  
  28.   
  29. # Process 5 updates  
  30. total_value = 0  
  31. for update_nbr in range (5):  
  32.     string = socket.recv()  
  33.     topic, messagedata,pub_server_name = string.split()  
  34.     total_value += int(messagedata)  
  35.     print topic, messagedata,pub_server_name  
  36.   
  37. print "Average messagedata value for topic '%s' was %dF" % (topicfilter, total_value / update_nbr)  

  客户端只接收主题为10001的数据

PUB输出:

Java代码   收藏代码
  1. topic:10003 messagedata:7  
  2. topic:10000 messagedata:-27  
  3. topic:10000 messagedata:37  
  4. topic:10001 messagedata:-11  
  5. topic:10001 messagedata:-14  
  6. topic:9999 messagedata:38  

client输出:

Java代码   收藏代码
  1. 10001 -11pub-server01  
  2. 10001 -14 pub-server01  

  

  另外:PUB/SUB是异步的,谁先开后开都行,就是说如果PUB已经开起来发送数据,然后SUB端起来,那么之前的那些数据SUB就收不到了,PUB和SUB逻辑上可以说是解耦的,二者不互相依赖。

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

  最后是要点:

    1.PUB未与SUB有逻辑上的连接,所以PUB可以很简单的drop掉数据(意思就是只管发)

    2.如果你用的是TCP,然后SUB端要搞点什么比较慢,数据会Queue在PUB那头

    3. 目前版本(最新版) filter(就是主题过滤)是在SUB端的,不是在PUB端,就是说SUB端比较苦逼,要全部收下一堆数据,再慢慢挑,这好像太那个了吧^_^

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值