zmq

安装方法

sudo apt-get install python-zmq

一般使用: 多个客户端,一个服务端,多个客户端可以连接一个服务端发送消息

Request-Reply模式:
消息双向的,有来有往,req端请求的消息,rep端必须答复给req端
客户端在请求后,服务端必须回响应,注意:服务端不返回响应会报错

# 服务端 接收者
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    message = socket.recv()
    print(message)
    socket.send("server response!".encode())
# 客户端 发送者
import zmq
import sys

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

while(True):
    data = input("input your data:")
    if data == 'q':
        sys.exit()

    socket.send(data.encode())

    response = socket.recv();
    print(response)

订阅模式:一个发布者,多个订阅者

Publish-Subscribe模式:
消息单向的,有去无回
广播所有client,没有队列缓存,断开连接数据将永远丢失。client可以进行数据过滤

# 发布者
import zmq 

context = zmq.Context()  
socket = context.socket(zmq.PUB)  
socket.bind("tcp://127.0.0.1:5000")  
while True:  
    msg = input('input your data:') 
    socket.send(msg.encode())
# 订阅者1
import zmq  

context = zmq.Context()  
socket = context.socket(zmq.SUB)  
socket.connect("tcp://127.0.0.1:5000")  
socket.setsockopt(zmq.SUBSCRIBE,''.encode()) 
while True:  
    print(socket.recv())
# 订阅者2
import zmq  

context = zmq.Context()  
socket = context.socket(zmq.SUB)  
socket.connect("tcp://127.0.0.1:5000")  
socket.setsockopt(zmq.SUBSCRIBE,''.encode()) 
while True:  
    print(socket.recv())

平行管道模式

Parallel Pipeline模式:
消息单向的,也是有去无回的。push的任何一个消息,始终只会有一个pull端收到消息
由三部分组成,push进行数据推送,work进行数据缓存,pull进行数据竞争获取处理。区别于Publish-Subscribe存在一个数据缓存和处理负载。
当连接被断开,数据不会丢失,重连后数据继续发送到对端

# pull进行数据竞争获取处理
import zmq

context = zmq.Context()

socket = context.socket(zmq.PULL)
socket.bind('tcp://*:5558')

while True:
    data = socket.recv()
    print(data)
# work进行数据缓存和转发
import zmq

context = zmq.Context()

recive = context.socket(zmq.PULL)
recive.connect('tcp://127.0.0.1:5557')

sender = context.socket(zmq.PUSH)
sender.connect('tcp://127.0.0.1:5558')

while True:
    data = recive.recv()
    sender.send(data)
# push进行数据推送
import zmq

context = zmq.Context()
socket = context.socket(zmq.PUSH)

socket.bind('tcp://*:5557')

while True:
    data = input('input your data:')
    socket.send(data.encode())
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。