我有一个服务器进程,它接收来自Web客户端的请求 . 服务器必须调用外部工作进程(另一个.py),该进程将数据流式传输到服务器,服务器流回客户端 .
服务器必须监视这些工作进程并向它们发送消息(基本上杀死它们或发送消息来控制流式传输哪种数据) . 这些消息是异步的(例如,取决于Web客户端)
我想在 ipc://
-transport-class上使用ZeroMQ套接字,但是对 socket.recv()
方法的调用是阻塞的 .
我应该使用两个套接字(一个用于将数据流式传输到服务器而另一个用于从服务器接收控制消息)?
2 回答
使用单独的套接字进行信令和消息传递总是更好
虽然
Poller
-instance会有所帮助,但主要步骤是使用单独的套接字进行信令,而另一个套接字用于数据流 . 总是 . 关键是,在这种设置中,Poller.poll()
和事件循环都可以保持特定于套接字,并且在实时受控代码执行期间花费的时间不超过预定义的时间 .因此,不要犹豫,设置一个更丰富的信令/消息传递基础设施作为一个环境,你只会享受增加的控制简单性,关注点分离和意图清晰度 .
ZeroMQ是一个很好的工具 - 包括每插槽IO线程亲和性,所以确实可以在您的指尖轻松实现细粒度性能调整 .
我认为如果想出一个解决方案,但我不知道是否有更好的(更高效,更安全......)方式 .
client
向server
发出请求,该请求产生N
进程worker
以参加请求 .这是
worker.py
的相关摘录:通过这种方式,
worker
a)不需要单独的套接字,并且b)不需要单独的线程来处理来自server
的消息 .在实际实现中,
worker
必须将100字节的128字节消息流式传输到server
,server
必须接收大量此消息(许多客户端询问每个需要3-10worker
的请求) . 如果以这种方式实施,这种方法会遭受性能损失吗?