首页 文章

ZeroMQ与子进程的双向异步通信

提问于
浏览
1

我有一个服务器进程,它接收来自Web客户端的请求 . 服务器必须调用外部工作进程(另一个.py),该进程将数据流式传输到服务器,服务器流回客户端 .

服务器必须监视这些工作进程并向它们发送消息(基本上杀死它们或发送消息来控制流式传输哪种数据) . 这些消息是异步的(例如,取决于Web客户端)

我想在 ipc:// -transport-class上使用ZeroMQ套接字,但是对 socket.recv() 方法的调用是阻塞的 .

我应该使用两个套接字(一个用于将数据流式传输到服务器而另一个用于从服务器接收控制消息)?

2 回答

  • 1

    使用单独的套接字进行信令和消息传递总是更好

    虽然 Poller -instance会有所帮助,但主要步骤是使用单独的套接字进行信令,而另一个套接字用于数据流 . 总是 . 关键是,在这种设置中, Poller.poll() 和事件循环都可以保持特定于套接字,并且在实时受控代码执行期间花费的时间不超过预定义的时间 .

    因此,不要犹豫,设置一个更丰富的信令/消息传递基础设施作为一个环境,你只会享受增加的控制简单性,关注点分离和意图清晰度 .

    ZeroMQ是一个很好的工具 - 包括每插槽IO线程亲和性,所以确实可以在您的指尖轻松实现细粒度性能调整 .

  • 0

    我认为如果想出一个解决方案,但我不知道是否有更好的(更高效,更安全......)方式 . clientserver 发出请求,该请求产生 N 进程 worker 以参加请求 .

    这是 worker.py 的相关摘录:

    for i in range(start_counter,10):
        # Check if there is any message from server
        while True:
            try:
                msg = worker.recv(zmq.DONTWAIT)
                print("Received {} from server".format(msg))
            except zmq.Again:
                break
    
        # Send data to server
        worker.send(b"Message {} from {}".format(i, worker_id))
    
        # Take some sleep
        time.sleep(random.uniform(0.3, 1.1))
    

    通过这种方式, worker a)不需要单独的套接字,并且b)不需要单独的线程来处理来自 server 的消息 .

    在实际实现中, worker 必须将100字节的128字节消息流式传输到 serverserver 必须接收大量此消息(许多客户端询问每个需要3-10 worker 的请求) . 如果以这种方式实施,这种方法会遭受性能损失吗?

相关问题