pyzmq非阻塞套接字

时间:2012-09-18 01:16:27

标签: python node.js zeromq nonblocking pyzmq

有人能指出一个带有Python绑定的REQ / REP非阻塞ZeroMQ(0MQ)的例子吗?也许我对ZMQ的理解是错误的,但我在网上找不到一个例子。

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

2 个答案:

答案 0 :(得分:2)

您可以将zmq.Poller(您可以在zguide repo中找到的许多示例,例如rrbroker.py)或gevent-zeromq实施(code sample)用于此目标。

答案 1 :(得分:0)

接受的答案中提供的示例提供了要点,但您可以通过对代理使用zmq.device来简化一些工作,同时坚持使用“扩展的请求-答复”模式来自the guide。这样,该服务器的世俗示例可能类似于以下内容:

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