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

Python ZeroMQ与子进程的双向异步通信,python,sockets,ipc,zeromq,Python,Sockets,Ipc,Zeromq,我有一个服务器进程,它接收来自web客户端的请求。 服务器必须调用一个外部工作进程(另一个.py),该进程将数据流传输到服务器,服务器将数据流传回客户端 服务器必须监视这些工作进程并向它们发送消息(基本上是杀死它们或发送消息以控制哪种数据流)。这些消息是异步的(例如,取决于web客户端) 我想在ipc://-传输类上使用ZeroMQ套接字,但是对socket.recv()方法的调用被阻塞了 我是否应该使用两个套接字(一个用于向服务器传输数据,另一个用于从服务器接收控制消息)?使用单独的套接字发送

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

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

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

我是否应该使用两个套接字(一个用于向服务器传输数据,另一个用于从服务器接收控制消息)?

使用单独的套接字发送信号和发送消息总是更好 虽然轮询器实例将有所帮助,但最基本的步骤是使用单独的套接字发送信号,另一个用于数据流。总是。关键是,在这种设置中,
Poller.poll()
和事件循环都可以保持套接字特定,并且在实时控制的代码执行期间花费的时间不超过预定义的时间量

因此,请毫不犹豫地建立一个更丰富的信令/消息传递基础设施,在这样的环境中,您将只享受更简单的控制、关注点的分离和意图的清晰


ZeroMQ是一个很好的工具,可以实现这一点,包括每套接字IO线程亲和力,因此您可以随时进行细粒度性能调整。

我认为如果找到了解决方案,但我不知道是否有更好(更高效、更安全,…)的方法。
客户端
服务器
发出请求,该服务器产生
N
进程
工作者
来处理请求

这是
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))
通过这种方式,
工作者
a)不需要单独的套接字,b)不需要单独的线程来处理来自
服务器
的消息

在实际的实现中,
工作者
必须以100Hz的频率将128字节的消息流传送到
服务器
,而
服务器
必须接收大量此类消息(许多请求请求的客户机需要3-10个工作者)。
如果以这种方式实现,这种方法会影响性能吗?

您可以使用a来实现非阻塞代码。+1表示使用两个单独的套接字的想法。我也认为这就是为什么要去。我在考虑使用普通套接字和一个单独的线程来处理消息。ZeroMQ如何在这方面帮助我?基本上,我不太理解你的最后一句话。一旦一个人管理了几个琐碎的ZeroMQ可伸缩正式通信行为原型,接下来就是性能。使用ZeroMQ API,可以精细地调整最大性能/最小延迟,一个套接字具有绝对优先级(一个私有的ZeroMQ数据泵IO线程,而其他的,low prio可能会共享其他ZeroMQ数据泵IO线程池——所有这些仍然在一个高级API下,因此能够从相同的、高级的、语言预API ZeroMQ套接字抽象中设置和调整所有马戏团。没有人愿意在低级别资源处理试验中涵盖所有这些/错误)