首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与子进程的ZeroMQ双向异步通信

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

Stack Overflow用户
提问于 2017-09-10 17:27:33
回答 2查看 507关注 0票数 3

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

服务器必须监控这些工作进程,并向它们发送消息(基本上是终止它们或发送消息来控制哪种类型的数据被流式传输)。这些消息是异步的(例如,依赖于web客户端)

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

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

EN

回答 2

Stack Overflow用户

发布于 2017-09-10 20:43:31

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

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

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

ZeroMQ是一个很好的工具,可以做到这一点--包括每个套接字的IO-线程亲和性,因此您可以轻松地进行细粒度的性能调优。

票数 2
EN

Stack Overflow用户

发布于 2017-09-11 07:00:44

我想如果想出一个解决方案,但我不知道是否有更好的(更有效,更安全,...)做这件事的方式。clientserver发出请求,后者产生N进程worker来处理该请求。

以下是worker.py的相关摘录

代码语言:javascript
复制
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 10的频率向server发送128字节的消息,并且server必须接收大量这样的消息(许多客户端请求请求,每个客户端需要3-10 worker )。如果以这种方式实现,这种方法是否会对性能造成影响?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46139185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档