用ZeroMQ实现障碍的好方法是什么?

问题描述 投票:1回答:1

我有一个屏障实现,使用PAIR/PAIR互连。

服务器端将向客户端发送JSON消息,然后等待客户端发送消息。我将在一项测试中发送40000条消息,并重复10次以计算平均使用时间。

pair_Server.py

import zmq
import random
import sys
import time

context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.bind("tcp://*:5556")

totalTime = 0
for testCount in range(10):
    isFirstSend = True
    startTime = 0
    for num in range(40000):
        socket.send_json({ 'num' : num })
        if isFirstSend:
            isFirstSend = False
            startTime = time.time()
        msg = socket.recv_json()
    totalTime += (time.time() - startTime)
    print("Finish test {}".format(testCount))

print(totalTime / 10)

pair_Client.py

import zmq
import random
import sys
import time

context = zmq.Context()
socket = context.socket(zmq.PAIR)
socket.connect("tcp://localhost:5556")

while True:
    msg = socket.recv_json()
    socket.send_json(msg)

输出时间花费约为4.3秒。然后,我删除障碍。现在,服务器将仅向客户端发送JSON消息,而无需等待回复。 10轮后。平均花费的时间为0.3秒。

我知道速度会变快,但差异如此之大,我想问一下我是否使用了错误的实现。我已经尝试过PUSH/PULL套接字进行类似的实现,并且得到了类似的结果。

python-3.x performance zeromq pyzmq low-latency
1个回答
0
投票

如果从未使用过ZeroMQ,在这里您可以先看看"ZeroMQ Principles in less than Five Seconds",然后再深入研究更多细节]]


Q

一种好方法实现具有ZeroMQ的障碍吗?”

最好的方法是不执行这样的操作-在性能和延迟方面。

原样代码没有实现障碍,它会强制本地进程停止并停留在不受约束的等待状态,以使远程分布式进程可以接收([ifever

),对其进行处理(如果曾经开始并且还希望完成了),并至少做出一些回答(此处是交货,如果曾经发生,至少为零) -length条消息就可以了)-before-它只会向前移动一步。

这是很疯狂的,基本上是不安全的假设,对吗?

我永远不会接受代码(不仅是针对生产级软件的代码),它会故意接受自身以使这种自我监禁变成几乎无法挽救的mamooth-trap

(自己已经失去了对代码执行的控制,运行它的整个设备……产生了无用的牺牲品……取决于不确定的外部因素,这些因素完全超出了您的控制范围-可能,但是有点-方便-记住阿波罗11号在月球上着陆了……等待Aha的糟糕又丑陋的片刻,是不是?)

您的“ barrier”-更少的代码只是测量循环,以抛出一批按钮按下(无需等待,每个此类按钮按下实际上开始执行的操作-是自动加农炮按钮,还是卫星遥感相机按钮,使卫星实际上位于Ryugu小行星表面上方几米处,相距几十光分钟,您才能听到您的第一个按钮-“推” ...

因此,实际的[[distributed

-((behavioural)-protocol决定什么可能成为可行的解决方案,而什么则不可行。
© www.soinside.com 2019 - 2024. All rights reserved.