關於Pyzmq介紹

coldplay.xixi
發布: 2020-09-02 17:19:41
轉載
35462 人瀏覽過

【相關學習推薦:#python教學

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)
登入後複製

以上是關於Pyzmq介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!