[関連する学習の推奨事項: Python チュートリアル ]
ZMQ (以下、ZeroMQ を ZMQ と呼びます) は、シンプルで使いやすいトランスポート層であり、ソケット プログラミングをより簡単にするフレームワークのようなソケット ライブラリです。簡潔かつ高性能。
は、複数のスレッド、コア、ホスト ボックス間で柔軟に拡張できるメッセージ処理キュー ライブラリです。 ZMQ の目標は、「標準のネットワーク プロトコル スタックの一部となり、後に Linux カーネルに組み込まれる」ことです。
ZMQ を使用すると、高性能ネットワーク アプリケーションを非常に簡単に楽しく作成できます。
ZeroMQ はソケットのカプセル化ではないため、既存のネットワーク プロトコルの実装には使用できません。
下位レベルのポイントツーポイント通信モードとは異なる独自のモードがあります。
TCP プロトコルよりも上位のプロトコルです。 (もちろん、ZeroMQ は必ずしも TCP プロトコルに基づいているわけではありません。プロセス間およびプロセス内通信にも使用できます)
zeromq
は rabbitmq# とは異なります## メッセージ キュー、実際には 1 つのメッセージ キュー コンポーネントと 1 つのライブラリのみです。
zeromq.org/langages/python/ | |
---|---|
github.com/zeromq/pyzmq | |
zeromq.github.io/pyzmq/ | |
zguide.zeromq.org/py:all |
メッセージは次のとおりです。双方向、送受信。要求側によって要求されたメッセージの場合、担当側は要求側に応答する必要があります。
2. サブスクリプション公開モード (パブリッシュおよびサブ)メッセージは一方通行であり、返信はありません。パブリッシュ側は特定のトピックに関するメッセージをパブリッシュでき、サブスクライブ側は気に入ったトピックをサブスクライブできます。サブスクライブ側は、サブスクライブしたトピックのみを受信します。パブリッシャーは、複数のサブスクライバーが受信できるメッセージをパブリッシュします。
3. プッシュ プル モードメッセージは一方通行であり、返信はありません。どのプッシュ メッセージでも、1 つのプル エンドのみがメッセージを受信します。
後続のプロキシ モードとルーティング モードはすべて、3 つの基本モードの拡張または変更です。
応答する必要があります。リクエストを送信し、サーバーがリクエストに応答するまで待ちます。クライアント側からは、送信と受信のペアが必要です。
逆に、サーバー側からは、送信と受信のペアが必要です。サーバーとクライアントの両方を 1:N モデルにすることができます。通常、1 はサーバー、N はクライアントとみなされます。
ZMQ はルーティング機能を非常に適切にサポートし (ルーティング機能を実装するコンポーネントはデバイスと呼ばれます)、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:
#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'))
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)
接続が切断されてもデータは失われず、再接続後もデータは引き続きピアに送信されます。
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 中国語 Web サイトの他の関連記事を参照してください。