Pythonバインディングを使用したREQ/REPノンブロッキングZeroMQ(0MQ)の例を誰かに教えてもらえますか?おそらく、ZMQについての私の理解は間違っていますが、オンラインで例を見つけることができませんでした。
Node.JSに、複数のクライアントからサーバーに作業を送信するサーバーがあります。サーバーは、あるクライアントのデータを処理してから次のクライアントのデータを処理する代わりに、並行して動作する一連のジョブを起動できるという考え方です。
Pythonバインディングを使用したREQ/REPノンブロッキングZeroMQ(0MQ)の例を誰かに教えてもらえますか?おそらく、ZMQについての私の理解は間違っていますが、オンラインで例を見つけることができませんでした。
Node.JSに、複数のクライアントからサーバーに作業を送信するサーバーがあります。サーバーは、あるクライアントのデータを処理してから次のクライアントのデータを処理する代わりに、並行して動作する一連のジョブを起動できるという考え方です。
この目標には、zmq.Poller
(zguideリポジトリにある多くの例(rrbroker.pyなど))またはgevent-zeromq
実装(コードサンプル)の両方を使用できます。
受け入れられた回答で提供されている例はその要点を示していますが、ガイドzmq.device
の「拡張要求-応答」パターンに固執しながらブローカーに使用することで、もう少し簡単なことを回避することもできます。そのため、サーバーのhello worldyの例は、次のようになります。
import time
import threading
import zmq
context = zmq.Context()
def worker():
socket = context.socket(zmq.REP)
socket.connect('inproc://workers')
while True:
msg = socket.recv_string()
print(f'Received request: [{msg}]')
time.sleep(1)
socket.send_string(msg)
url_client = 'tcp://*:5556'
clients = context.socket(zmq.ROUTER)
clients.bind(url_client)
workers = context.socket(zmq.DEALER)
workers.bind('inproc://workers')
for _ in range(4):
thread = threading.Thread(target=worker)
thread.start()
zmq.device(zmq.QUEUE, clients, workers)
ここでは、4人のワーカーが着信要求を並行して処理できるようにしています。ここでは、クライアント側でNodeを使用していますが、例を完全なものにするために、以下のPythonクライアントを使用してこれが機能することを確認できます。ここでは、3つのバッチで処理される10個のリクエストを作成しています。
import zmq
import threading
context = zmq.Context()
def make_request(a):
socket = context.socket(zmq.REQ)
socket.connect('tcp://localhost:5556')
print(f'Sending request {a} ...')
socket.send_string(str(a))
message = socket.recv_string()
print(f'Received reply from request {a} [{message}]')
for a in range(10):
thread = threading.Thread(target=make_request, args=(a,))
thread.start()