设为首页 收藏本站
查看: 1678|回复: 0

[经验分享] saltstack系列(五)——zmq扩展(一)

[复制链接]

尚未签到

发表于 2018-1-4 08:35:04 | 显示全部楼层 |阅读模式
问题
  假设我们的一个客户端既有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,道理其实也很简单,服务就是服务,多个员工可以挤在一个办公司里办公,哪有多个老板挤在一起办公的。  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431405-1-1.html 上篇帖子: saltstack系列(六)——zmq扩展(二) 下篇帖子: Saltstack生产案例之php和memcached安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表