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实现它的好方法是什么?非常感谢。