Pyzmq介绍

在看到自然语言的一个框架时发现使用这个框架,就了解一下。
ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。

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

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

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

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

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

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

Pyzmq官网: zeromq.org/languages/python/
Github github.com/zeromq/pyzmq
Docs zeromq.github.io/pyzmq/
Guide zguide.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(只需要加入若干路由节点)。

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



服务端:

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存在一个数据缓存和处理负载。
当连接被断开,数据不会丢失,重连后数据继续发送到对端。
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)

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

javastart

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值