【相關學習推薦:#python教學】
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 |
# pip install pyzmq
1. 請求回應模式(Request-Reply)(rep 和req)
#訊息雙向的,有來有往,req端請求的訊息,rep端必須答覆給req端
2. 訂閱發布模式(pub 和sub)
訊息單向的,有去無回的。可依照發布端可發佈制定主題的訊息,訂閱端可訂閱喜歡的主題,訂閱端只會收到自己已訂閱的主題。發布端發布一則訊息,可被多個訂閱端同事收到。
3. push pull模式
訊息單向的,也是有去無回的。 push的任何一個訊息,總是只會有一個pull端收到訊息.
後續的代理模式和路由模式等都是在三種基本模式上面的擴展或變異。
#客戶端在請求後,服務端必須回應
由客戶端發起請求,並等待服務端回應請求。從客戶端端來看,一定是一對對發收配對的;
反之,在服務端一定是收發對。服務端和客戶端都可以是1:N的模型。通常把1認為是server,N認為是Client。
ZMQ可以很好的支援路由功能(實現路由功能的元件叫做Device),把1:N擴展為N:M(只需要加入若干路由節點)。
從這個模型看,更底層的端點位址是對上層隱藏的。每個請求都隱含回應位址,而應用程式則不關心它
服務端:
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'))
#廣播所有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)
由三部分組成,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中文網其他相關文章!