Python 3.x 使用ZeroMQ实现屏障的好方法是什么?

Python 3.x 使用ZeroMQ实现屏障的好方法是什么?,python-3.x,performance,zeromq,pyzmq,low-latency,Python 3.x,Performance,Zeromq,Pyzmq,Low Latency,我有一个屏障实现,使用对/对互连 服务器端将向客户端发送JSON消息,然后等待客户端发送消息。我将在一次测试中发送40000条消息,并重复10次以计算平均使用时间 配对服务器.py: import zmq import random import sys import time context = zmq.Context() socket = context.socket(zmq.PAIR) socket.bind("tcp://*:5556") totalTime = 0 for test

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

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

配对服务器.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)
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)
配对客户端.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)
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秒

我知道速度会越来越快,但是差别太大了,我想问一下,如果我使用了错误的实现。我已经尝试了推/拉插座来实现类似的实现,并得到了类似的结果。


如果您从未使用过ZeroMQ,
您可能会喜欢在深入了解更多细节之前先看看


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

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

原样代码没有实现障碍,它强制本地端进程停止并停留在无约束的等待状态,等待远程分布式进程接收(如果有),处理它(如果有启动,也希望完成),并至少给出一些答案(在这里,一个传递,如果发生,至少一个零长度的消息是可以的)——之前——它将向前移动一步。

这是相当疯狂的&主要是不安全的假设,不是吗

我永远不会接受一个代码(不仅仅是生产级软件),它会故意接受自己导致这样一个自我监禁,陷入这样一个几乎无法挽救的陷阱(你自己已经失去了对代码执行的控制,它运行的整个设备……产生了一个无用的牺牲品……取决于不确定的外部巧合因素,这些因素完全超出了你的控制范围——可能,但有点不方便——还记得阿波罗11号登月……等待啊哈的糟糕而丑陋的晚了时刻吗。。.不是吗?)

您的“无障碍”代码只测量了抛出一批按钮的循环(不用等待,每次按下按钮实际上都开始做什么——无论是自动加农炮点火按钮,还是卫星遥感相机按钮,卫星实际上离龙古小行星表面几米远,距离你的第一个按钮——“按下”


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

感谢您的回答。我阅读了您提供的帖子,还阅读了其他一些文章
https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pushpull.html
了解基本情况。很抱歉,我使用了一个愚蠢的示例但是我想实现的主要思想是,如果服务器端没有收到来自客户端的回复,它就不应该走得更远。用ZMQ实现它的好方法是什么?非常感谢。