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

[经验分享] python zeromq

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-4-23 11:00:00 | 显示全部楼层 |阅读模式
  python examples https://github.com/imatix/zguide/tree/master/examples/Python
  
  hwserver.py
  
   
     
Python代码 DSC0000.gif DSC0001.png DSC0002.gif       
         
  • #      
  • # Hello World server in Python      
  • # Binds REP socket to tcp://*:5555      
  • # Expects "Hello" from client, replies with "World"      
  • #      
  • import zmq      
  • import time      
  •       
  • context = zmq.Context()      
  • socket = context.socket(zmq.REP)      
  • socket.bind("tcp://*:5555")      
  •       
  • while True:      
  • # Wait for next request from client      
  • message = socket.recv()      
  • print "Received request: ", message      
  •       
  • # Do some 'work'      
  • time.sleep (1) # Do some 'work'      
  •       
  • # Send reply back to client      
  • socket.send("World")   
   #
#   Hello World server in Python
#   Binds REP socket to tcp://*:5555
#   Expects "Hello" from client, replies with "World"
#
import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
#  Wait for next request from client
message = socket.recv()
print "Received request: ", message
#  Do some 'work'
time.sleep (1)        #   Do some 'work'
#  Send reply back to client
socket.send("World")
  hwclient.py






Python代码

  • #
  • # Hello World client in Python
  • # Connects REQ socket to tcp://localhost:5555
  • # Sends "Hello" to server, expects "World" back
  • #
  • import zmq

  • context = zmq.Context()

  • # Socket to talk to server
  • print "Connecting to hello world server..."
  • socket = context.socket(zmq.REQ)
  • socket.connect ("tcp://localhost:5555")

  • # Do 10 requests, waiting each time for a response
  • for request in range (1,10):
  • print "Sending request ", request,"..."
  • socket.send ("Hello")

  • # Get the reply.
  • message = socket.recv()
  • print "Received reply ", request, "[", message, "]"


#
#   Hello World client in Python
#   Connects REQ socket to tcp://localhost:5555
#   Sends "Hello" to server, expects "World" back
#
import zmq
context = zmq.Context()
#  Socket to talk to server
print "Connecting to hello world server..."
socket = context.socket(zmq.REQ)
socket.connect ("tcp://localhost:5555")
#  Do 10 requests, waiting each time for a response
for request in range (1,10):
print "Sending request ", request,"..."
socket.send ("Hello")
#  Get the reply.
message = socket.recv()
print "Received reply ", request, "[", message, "]"

  问题3:zeroMQ实现一个消息层?
  答:
  实现一个ZeroMQ消息层需要三个步骤:
  1.选择传输协议
  0MQ提供了4种不同的传输协议
  INPROC an In-Process communication model
  IPC an Inter-Process communication model
  MULTICAST multicast via PGM, possibly encapsulated in UDP
  TCP a network based transport
  
  2.建立基础
  由于在网络中两个端点是相对动态的,很难有一个稳定的单一连接点。
  如果是这种情况,可以使用由0MQ提供的转发设备。
  转发设备可以绑定2个不同端口,并且转发消息从一个端点到另一个端点。
  这样做的话,在网络中转发设备能够变成一个稳定的点,其它组件都可以去连接。
  
  0MQ提供了3种类型的设备
  QUEUE, a forwarder for the request/response messaging pattern
  FORWARDER, a forwarder for the publish/subscribe messaging pattern
  STREAMER, a forwarder for the pipelined messaging pattern
  
  
  3.选择通讯模式
  0MQ支持4种模式
  REQUEST/REPLY, bidirectional, load balanced and state based
  PUBLISH/SUBSCRIBE, publish to multiple recipients at once
  UPSTREAM / DOWNSTREAM, distribute data to nodes arranged in a pipeline
  PAIR, communication exclusively between peers
  
  Req/Rep
  均衡负载请求:
  server 1






Python代码

  • import zmq
  • context = zmq.Context()
  • socket = context.socket(zmq.REP)
  • socket.bind("tcp://127.0.0.1:5000")

  • while True:
  • msg = socket.recv()
  • print "Got", msg
  • socket.send(msg)


import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:5000")
while True:
msg = socket.recv()
print "Got", msg
socket.send(msg)

  server 2






Python代码

  • import zmq
  • context = zmq.Context()
  • socket = context.socket(zmq.REP)
  • socket.bind("tcp://127.0.0.1:6000")

  • while True:
  • msg = socket.recv()
  • print "Got", msg
  • socket.send(msg)


import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://127.0.0.1:6000")
while True:
msg = socket.recv()
print "Got", msg
socket.send(msg)
  client






Python代码

  • import zmq
  • context = zmq.Context()
  • socket = context.socket(zmq.REQ)
  • socket.connect("tcp://127.0.0.1:5000")
  • socket.connect("tcp://127.0.0.1:6000")

  • for i in range(10):
  • msg = "msg %s" % i
  • socket.send(msg)
  • print "Sending", msg
  • msg_in = socket.recv()


import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://127.0.0.1:5000")
socket.connect("tcp://127.0.0.1:6000")
for i in range(10):
msg = "msg %s" % i
socket.send(msg)
print "Sending", msg
msg_in = socket.recv()

  会发现client的请求会被均衡的分配给两个server
  Example client output:

  Sending msg 0
Sending msg 1
Sending msg 2
Sending msg 3
Sending msg 4
Sending msg 5
Sending msg 6
Sending msg 7
Sending msg 8
Sending msg 9


  Example output server 1 at port 5000:

  Got msg 0
Got msg 2
Got msg 4
Got msg 6
Got msg 8


  Example output server 2 at port 6000:

  Got msg 1
Got msg 3
Got msg 5
Got msg 7
Got msg 9


  现在,如果我们要加入一个额外的server去管理我们的请求,我们将不得不修改我们的代码。
  这是非常麻烦的,我们需要让每个client都知道有一个额外的server可以均衡请求。
  为了解决这个问题,替代client直接去连接多个server的方式,client去连接转发设备,再由转发设备路由全部的消息给server。
  
  Pub/Sub
  在pub/sub模式下组件是松耦合的。类似于广播电台。
  一个广播server为现场足球赛






Python代码

  • import zmq
  • from random import choice
  • context = zmq.Context()
  • socket = context.socket(zmq.PUB)
  • socket.bind("tcp://127.0.0.1:5000")

  • countries = ['netherlands','brazil','germany','portugal']
  • events = ['yellow card', 'red card', 'goal', 'corner', 'foul']

  • while True:
  • msg = choice( countries ) +" "+ choice( events )
  • print "->",msg
  • socket.send( msg )  


import zmq
from random import choice
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://127.0.0.1:5000")
countries = ['netherlands','brazil','germany','portugal']
events = ['yellow card', 'red card', 'goal', 'corner', 'foul']
while True:
msg = choice( countries ) +" "+ choice( events )
print "->",msg
socket.send( msg )
  输出
  -> portugal corner
-> portugal yellow card
-> portugal goal
-> netherlands yellow card
-> germany yellow card
-> brazil yellow card
-> portugal goal
-> germany corner

  
  一个客户端去收听特定的消息






Python代码

  • import zmq

  • context = zmq.Context()
  • socket = context.socket(zmq.SUB)
  • socket.connect("tcp://127.0.0.1:5000")
  • socket.setsockopt(zmq.SUBSCRIBE, "netherlands")
  • socket.setsockopt(zmq.SUBSCRIBE, "germany")

  • while True:
  • print socket.recv()


import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:5000")
socket.setsockopt(zmq.SUBSCRIBE, "netherlands")
socket.setsockopt(zmq.SUBSCRIBE, "germany")
while True:
print  socket.recv()
  输出
  netherlands red card
netherlands goal
netherlands red card
germany foul
netherlands yellow card
germany foul
netherlands goal
netherlands corner
germany foul
netherlands corner

  
  Pipelining
  并发处理数据,其工作模式
  一个工作者得到来自上游socket的消息,一旦处理完成后发送消息到下游。
  
  Paired socket
  服务器监听某个端口,客户端连接到这个端口,消息可以双向流动。
  server






Python代码

  • import zmq
  • context = zmq.Context()
  • socket = context.socket(zmq.PAIR)
  • socket.bind("tcp://127.0.0.1:5555")


import zmq
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.bind("tcp://127.0.0.1:5555")

  
  client






Python代码

  • import zmq
  • context = zmq.Context()
  • socket = context.socket(zmq.PAIR)
  • socket.connect("tcp://127.0.0.1:5555")


import zmq
context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.connect("tcp://127.0.0.1:5555")

  
  ps:
  推荐
  http://www.zeromq.org/
  http://nichol.as/zeromq-an-introduction

运维网声明 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-59986-1-1.html 上篇帖子: 使用Python创建Silverlight控件 下篇帖子: python IDLE的执行py文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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