• 技术文章 >后端开发 >Python教程

    关于Pyzmq介绍

    coldplay.xixicoldplay.xixi2020-09-02 17:19:41转载26730

    【相关学习推荐:python教程

    Pyzmq介绍

    ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。

    是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。

    ZMQ 让编写高性能网络应用程序极为简单和有趣。

    ZeroMQ并不是一个对socket的封装,不能用它去实现已有的网络协议。

    它有自己的模式,不同于更底层的点对点通讯模式。

    它有比tcp协议更高一级的协议。(当然ZeroMQ不一定基于TCP协议,它也可以用于进程间和进程内通讯)

    zeromq 并不是类似rabbitmq消息列队,它实际上只一个消息列队组件,一个库。


    Pyzmq官网:zeromq.org/languages/python/
    Githubgithub.com/zeromq/pyzmq
    Docszeromq.github.io/pyzmq/
    Guidezguide.zeromq.org/py:all

    Download

    pip install pyzmq

    Pyzmq的几种模式

    1. 请求应答模式(Request-Reply)(rep 和 req)

    消息双向的,有来有往,req端请求的消息,rep端必须答复给req端

    2. 订阅发布模式 (pub 和 sub)

    消息单向的,有去无回的。可按照发布端可发布制定主题的消息,订阅端可订阅喜欢的主题,订阅端只会收到自己已经订阅的主题。发布端发布一条消息,可被多个订阅端同事收到。

    3. push pull模式

    消息单向的,也是有去无回的。push的任何一个消息,始终只会有一个pull端收到消息.

    后续的代理模式和路由模式等都是在三种基本模式上面的扩展或变异。

    1. Request-Reply模式(请求响应模型):

    客户端在请求后,服务端必须回响应

    由客户端发起请求,并等待服务端响应请求。从客户端端来看,一定是一对对发收配对的;

    反之,在服务端一定是收发对。服务端和客户端都可以是1:N的模型。通常把1认为是server,N认为是Client。

    ZMQ可以很好的支持路由功能(实现路由功能的组件叫做Device),把1:N扩展为N:M(只需要加入若干路由节点)。

    从这个模型看,更底层的端点地址是对上层隐藏的。每个请求都隐含回应地址,而应用则不关心它

    img

    服务端:

    sever.py

     import zmq import sys
     context = zmq.Context()
     socket = context.socket(zmq.REP)
     socket.bind("tcp://*:5555")
     while True:
      try:
      print("wait for client ...")
      message = socket.recv()
      print("message from client:", message.decode('utf-8'))
      socket.send(message)
      except Exception as e:
      print('异常:',e)
      sys.exit()

    客户端:

    #client.py

     import zmq import sys
     context = zmq.Context()
     print("Connecting to server...")
     socket = context.socket(zmq.REQ)
     socket.connect("tcp://localhost:5555")
     while True:
     
      input1 = input("请输入内容:").strip()
      if input1 == 'b':
      sys.exit()
      socket.send(input1.encode('utf-8'))
     
      message = socket.recv()
      print("Received reply: ", message.decode('utf-8'))

    2.Publish-Subscribe模式(发布订阅模型):

    广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤。

    服务端

    server.py

     import zmq import time import sys
     context = zmq.Context()
     socket = context.socket(zmq.PUB)
     socket.bind("tcp://*:5555")
     
     while True:
      msg = input("请输入要发布的信息:").strip()
      if msg == 'b':
      sys.exit()
      socket.send(msg.encode('utf-8'))
      time.sleep(1)

    客户端1

    client1.py

     import zmq
     
     
     context = zmq.Context()
     socket = context.socket(zmq.SUB)
     socket.connect("tcp://localhost:5555")
     socket.setsockopt(zmq.SUBSCRIBE,''.encode('utf-8'))  # 接收所有消息 while True:
      response = socket.recv().decode('utf-8');
      print("response: %s" % response)

    客户端2

    client2.py

     import zmq
     context = zmq.Context()
     socket = context.socket(zmq.SUB)
     socket.connect("tcp://localhost:5555")
     socket.setsockopt(zmq.SUBSCRIBE,'123'.encode('utf-8'))  # 消息过滤  只接受123开头的信息 while True:
      response = socket.recv().decode('utf-8');
      print("response: %s" % response)

    3.Parallel Pipeline模式(管道模型):

     由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。区别于Publish-Subscribe存在一个数据缓存和处理负载。

    当连接被断开,数据不会丢失,重连后数据继续发送到对端。

    img

    server.py

     import zmq import time
     
     context = zmq.Context()
     socket = context.socket(zmq.PUSH)
     socket.bind("tcp://*:5557")
     
     while True:
      msg = input("请输入要发布的信息:").strip()
      socket.send(msg.encode('utf-8'))
      print("已发送")
      time.sleep(1)

    worker.py

     import zmq
     context = zmq.Context()
     receive = context.socket(zmq.PULL)
     receive.connect('tcp://127.0.0.1:5557')
     sender = context.socket(zmq.PUSH)
     sender.connect('tcp://127.0.0.1:5558')
     
     while True:
      data = receive.recv()
      print("正在转发...")
      sender.send(data)

    client.py

     import zmq
     context = zmq.Context()
     socket = context.socket(zmq.PULL)
     socket.bind("tcp://*:5558")
     
     while True:
      response = socket.recv().decode('utf-8')
      print("response: %s" % response)

    以上就是关于Pyzmq介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:learnku,如有侵犯,请联系admin@php.cn删除
    专题推荐:python Pyzmq
    上一篇:python如何产生10个不同的随机数 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • python运算符优先级有哪些• 爬取微信公众号文章并保存为PDF文件(Python方法)• 巧妙解决Python多线程死锁问题• JSON在Python中的使用介绍
    1/1

    PHP中文网