有人可以指出一个带有 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)
在这里,我们让四个工作人员并行处理传入的请求。现在,您在客户端使用 Node,但为了保持示例完整,可以使用下面的 Python 客户端来查看它是否有效。在这里,我们创建了 10 个请求,然后将分 3 批处理:
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()