非阻塞socket的Python实现pyzmq

6

有没有人能给我提供一个使用Python ZeroMQ(0MQ)绑定实现REQ/REP非阻塞的示例?也许我的ZMQ理解有误,但我在网上找不到示例。

我有一个Node.JS服务器,可以从多个客户端发送工作到服务器。这样做的想法是,服务器可以启动一堆并行操作的作业,而不是为一个客户端处理数据,然后再处理下一个客户端的数据。

2个回答

2
你可以使用 zmq.Poller(在 zguide 仓库中有很多示例,例如rrbroker.py)或者 gevent-zeromq 实现(代码示例)。

1

已接受答案中提供的示例大致说明了问题,但您也可以通过在代理中使用zmq.device并遵循指南中的“扩展请求-回复”模式来使用更简单的方式。因此,服务器的示例代码可以如下所示:

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接