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

时间:2017-09-10 09:27:33

标签: python sockets ipc zeromq

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

ZeroMQ是一个很好的工具 - 包括每个插槽的IO线程亲和力,所以确实可以轻松获得细粒度的性能调优。

答案 1 :(得分: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。 如果以这种方式实施,这种方法会遭受性能损失吗?