【问题标题】:What is a good way to implement a barrier with ZeroMQ?用 ZeroMQ 实现屏障的好方法是什么?
【发布时间】:2020-03-23 13:19:44
【问题描述】:

我有一个屏障实现,使用 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】:

    如果您从未使用过 ZeroMQ,
    您可以在这里先看看"ZeroMQ Principles in less than Five Seconds"
    在深入了解更多细节之前



    Q“什么是用 ZeroMQ 实现屏障好方法?”

    最好的方法是不实现这样的——性能方面和延迟方面。

    原样代码没有实现屏障,它强制本地进程停止并保持在不受约束的等待状态,以便远程分布式进程接收(如果有 ),处理它(如果曾经开始并希望完成)并至少给出一些答案(这里是交付, 如果发生了,至少零长度的消息是可以的)--之前--它会向前迈出一步。

    这是非常疯狂且主要是不安全的假设,不是吗?

    我永远不会接受一个代码(不仅是生产级软件),它会故意接受自己导致这种自我禁锢进入这种几乎无法挽救的猛犸象陷阱 (您自己已经失去了对代码执行及其运行的整个设备的控制......产生了一个无用的受害者......取决于不确定的外部巧合因素,这完全超出了您的控制范围 - 可能,但有点不方便——记得阿波罗 11 号登陆月球......等待啊哈的一个糟糕而丑陋的后期时刻......不是吗?)

    您的“障碍”代码仅测量抛出一批按钮推动的循环(无需等待,每个按钮推动实际上开始做什么 - 无论是自动大炮火按钮,或卫星遥感相机按钮,让卫星实际上在 Ryugu 小行星表面上方几米处,距离你的第一个按钮有几十光分钟——“按下”……

    因此,实际的分布式-(行为)-协议决定了哪些可能成为可行的解决方案,哪些不会。

    【讨论】:

    • 感谢您的回答。我阅读了您提供的主题,还阅读了其他一些文章https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pushpull.html 以获得基本理解。很抱歉我使用了一个愚蠢的例子,但我想要实现的主要思想是,如果服务器端没有收到来自客户端的回复,它不应该走得更远。用 ZMQ 实现它的好方法是什么?非常感谢。
    猜你喜欢
    • 2014-12-01
    • 2016-12-24
    • 2014-10-27
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2021-06-06
    相关资源
    最近更新 更多