溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Pyzmq指的是什么

發(fā)布時(shí)間:2020-09-04 14:27:41 來源:億速云 閱讀:571 作者:小新 欄目:編程語言

Pyzmq指的是什么?這個(gè)問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個(gè)問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

Pyzmq介紹

ZMQ (以下 ZeroMQ 簡(jiǎn)稱 ZMQ)是一個(gè)簡(jiǎn)單好用的傳輸層,像框架一樣的一個(gè) socket library,他使得 Socket 編程更加簡(jiǎn)單、簡(jiǎn)潔和性能更高。

是一個(gè)消息處理隊(duì)列庫,可在多個(gè)線程、內(nèi)核和主機(jī)盒之間彈性伸縮。ZMQ 的明確目標(biāo)是“成為標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議棧的一部分,之后進(jìn)入 Linux 內(nèi)核”。

ZMQ 讓編寫高性能網(wǎng)絡(luò)應(yīng)用程序極為簡(jiǎn)單和有趣。

ZeroMQ并不是一個(gè)對(duì)socket的封裝,不能用它去實(shí)現(xiàn)已有的網(wǎng)絡(luò)協(xié)議。

它有自己的模式,不同于更底層的點(diǎn)對(duì)點(diǎn)通訊模式。

它有比tcp協(xié)議更高一級(jí)的協(xié)議。(當(dāng)然ZeroMQ不一定基于TCP協(xié)議,它也可以用于進(jìn)程間和進(jìn)程內(nèi)通訊)

zeromq 并不是類似rabbitmq消息列隊(duì),它實(shí)際上只一個(gè)消息列隊(duì)組件,一個(gè)庫。

Pyzmq官網(wǎng):zeromq.org/languages/python/
Githubgithub.com/zeromq/pyzmq
Docszeromq.github.io/pyzmq/
Guidezguide.zeromq.org/py:all

Download

pip install pyzmq

Pyzmq的幾種模式

1. 請(qǐng)求應(yīng)答模式(Request-Reply)(rep 和 req)

消息雙向的,有來有往,req端請(qǐng)求的消息,rep端必須答復(fù)給req端

2. 訂閱發(fā)布模式 (pub 和 sub)

消息單向的,有去無回的。可按照發(fā)布端可發(fā)布制定主題的消息,訂閱端可訂閱喜歡的主題,訂閱端只會(huì)收到自己已經(jīng)訂閱的主題。發(fā)布端發(fā)布一條消息,可被多個(gè)訂閱端同事收到。

3. push pull模式

消息單向的,也是有去無回的。push的任何一個(gè)消息,始終只會(huì)有一個(gè)pull端收到消息.

后續(xù)的代理模式和路由模式等都是在三種基本模式上面的擴(kuò)展或變異。

1. Request-Reply模式(請(qǐng)求響應(yīng)模型):

客戶端在請(qǐng)求后,服務(wù)端必須回響應(yīng)

由客戶端發(fā)起請(qǐng)求,并等待服務(wù)端響應(yīng)請(qǐng)求。從客戶端端來看,一定是一對(duì)對(duì)發(fā)收配對(duì)的;

反之,在服務(wù)端一定是收發(fā)對(duì)。服務(wù)端和客戶端都可以是1:N的模型。通常把1認(rèn)為是server,N認(rèn)為是Client。

ZMQ可以很好的支持路由功能(實(shí)現(xiàn)路由功能的組件叫做Device),把1:N擴(kuò)展為N:M(只需要加入若干路由節(jié)點(diǎn))。

從這個(gè)模型看,更底層的端點(diǎn)地址是對(duì)上層隱藏的。每個(gè)請(qǐng)求都隱含回應(yīng)地址,而應(yīng)用則不關(guān)心它

Pyzmq指的是什么

服務(wù)端:

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("請(qǐng)輸入內(nèi)容:").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模式(發(fā)布訂閱模型):

廣播所有client,沒有隊(duì)列緩存,斷開連接數(shù)據(jù)將永遠(yuǎn)丟失。client可以進(jìn)行數(shù)據(jù)過濾。

服務(wù)端

server.py

 import zmq import time import sys
 context = zmq.Context()
 socket = context.socket(zmq.PUB)
 socket.bind("tcp://*:5555")
 
 while True:
  msg = input("請(qǐng)輸入要發(fā)布的信息:").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進(jìn)行數(shù)據(jù)推送,work進(jìn)行數(shù)據(jù)緩存,pull進(jìn)行數(shù)據(jù)競(jìng)爭(zhēng)獲取處理。區(qū)別于Publish-Subscribe存在一個(gè)數(shù)據(jù)緩存和處理負(fù)載。

當(dāng)連接被斷開,數(shù)據(jù)不會(huì)丟失,重連后數(shù)據(jù)繼續(xù)發(fā)送到對(duì)端。

Pyzmq指的是什么

server.py

 import zmq import time
 
 context = zmq.Context()
 socket = context.socket(zmq.PUSH)
 socket.bind("tcp://*:5557")
 
 while True:
  msg = input("請(qǐng)輸入要發(fā)布的信息:").strip()
  socket.send(msg.encode('utf-8'))
  print("已發(fā)送")
  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("正在轉(zhuǎn)發(fā)...")
  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)

感謝各位的閱讀!看完上述內(nèi)容,你們對(duì)Pyzmq指的是什么大概了解了嗎?希望文章內(nèi)容對(duì)大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI