当前位置: 首页 > 知识库问答 >
问题:

是时间。sleep()影响ZeroMQ轮询器。poll()响应?

黄磊
2023-03-14

当使用轮询发出ZeroMQREQ/REP请求时,我得到了无法解释的结果。

轮询()-方法占用的时间受到代码中其他地方的time.sleep()的影响。

我有一个服务器进程,它运行一个命令,并返回进程的pid。这是请求端代码,它有以下问题:

import datetime, sys, time, zmq

sleeptime = float(sys.argv[1])

def log_msg(msg):
    print "{0}, {1}".format(datetime.datetime.utcnow().strftime('%Y%m%d_%H:%M:%S.%f'), msg)

context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://{0}:{1}".format('myserver', 9980))
poller = zmq.Poller()
poller.register(socket, zmq.POLLIN)
req = { 'req_type':'raw_cmd', 'cmd':'echo hello', 'block':0, 'timeout':300, 'return_output': 0}

for i in range(4):
    time.sleep(sleeptime)
    socket.send_json(req)
    start = time.time()
    socks = dict((poller.poll(30000)))
    elapsed = (time.time()-start)*1000
    rep = socket.recv_json()
    log_msg('pid={0}, sleep={1}, time taken={2}'.format(rep['pid'], sleeptime, int(elapsed)))

第一次轮询经过的时间变化很大,但所有后续轮询所用的时间都比睡眠时间少约2秒,除非睡眠时间为0,在这种情况下,睡眠时间很快,因此:

sleep=0.5

20201008_08:27:24.168800, pid=52528, sleep=0.5, time taken=505
20201008_08:27:26.210196, pid=52529, sleep=0.5, time taken=1540
20201008_08:27:28.250891, pid=52530, sleep=0.5, time taken=1539
20201008_08:27:30.295036, pid=52531, sleep=0.5, time taken=1543

睡眠=1.5

20201008_08:44:02.474492, pid=54730, sleep=1.5, time taken=295
20201008_08:44:04.516844, pid=54731, sleep=1.5, time taken=540
20201008_08:44:06.557980, pid=54732, sleep=1.5, time taken=539
20201008_08:44:08.599717, pid=54733, sleep=1.5, time taken=539

睡眠=0

20201008_08:27:13.999147, pid=52513, sleep=0.0, time taken=690
20201008_08:27:14.033915, pid=52514, sleep=0.0, time taken=34
20201008_08:27:14.068803, pid=52515, sleep=0.0, time taken=34
20201008_08:27:14.103947, pid=52516, sleep=0.0, time taken=34

所以问题是,为什么time.sleep()会影响ZeroMQpoller.poll()花费的时间?

共有1个答案

韩安顺
2023-03-14

代码是将苹果和橙子混合在一起:

time.time()返回从纪元起的秒,即(time.time()-start)*1000产生多少[ms]毫秒的测试代码部分实际上拿走了。

轮询器。poll()。POLLIN-事件允许在任何较早的位置向前移动。

也就是说,您的度量方法不是探索。睡眠()-方法,而是由外部进程随机获取的间隔,该进程向REQ-side发送()-s发送REP-side答案。

还在怀疑中?将Hibernate时间设置为31[s],您应该会收到几乎为零的持续时间报告,从一个制定不当的本地时间括号(当然,当且仅当远程REP说谎的实体在这样的操作期间没有窒息崩溃)。

您可能还喜欢zmq。Stopwatch类,具有{.start(),.stop()}-方法,为使用ZeroMQ本机[us]-分辨率时钟提供智能工具。我在ZeroMQ performance上的大多数帖子都将其用于微基准标记。

 类似资料:
  • 2.17 响应时间(边缘) 2.17.1 描述 返回5分钟颗粒度的状态码明细数据,主要返回时间戳、省份、运营商、HIT/MISS、状态码、响应时间、请求数 2.17.2 请求地址 地址: https://api.bokecs.com/channel/responseTime?time={time}domain={domain} 2.17.3 请求方式 GET 2.17.4 请求参数 参数名称 是否

  • 我正在为我的UI元素制作一个简单的动画。 我有一个动画组件,它有2个不同的动画-ZoomIn和ZoomOut。 每当需要在屏幕上显示UI元素(如按钮)时,就会显示这些动画。 我通常更喜欢在不显示时停用游戏对象。 我为动画编写了以下方法: 对于大多数屏幕,代码工作正常,但当我使用timescale=0暂停游戏时,代码显示问题。 当时间刻度为0时,线gameObj。SetActive(false)不工

  • 如图:右边红色的提示 怎么会这样呢?(头大~) 当父盒子背景色为白色时‘正常’,或者把select的i标签的过渡给取消也就‘正常’了 可利用下面代码测试

  • 我们使用API网关Lambda函数DynamoDB来获取数据,并使用DynamoDB查询方法。对于260.4KB的数据(项目总计数:675 |扫描计数:3327),需要3.49秒。 要求: 我们有4个客户,我们每天计算客户销售用户的数据,并将其存储在数据库中。 表结构: 主键:ClientId 排序键:日期UserId 其他属性:日期 在查询中-我们使用主键ClientId 目前,我们正在为Dyn

  • 我的模拟模型中有在GIS空间漫游的代理。我建立了一个参数变化实验来产生复制。在运行期间,我收到了四条通知,“服务器没有响应。连接超时。”然而,模拟一直在运行,它仍然产生了结果。这个错误的影响是什么?为什么会这样? 我的路由是从开源地图服务器请求的,路由服务器选项是AnyLogic。

  • 问题内容: 我正在研究ajax长期轮询,但感到困惑。传统的ajax调用和长时间轮询有什么不同 此示例仅以递归方式调用服务器。与setInterval中的传统调用不同。 问题答案: 顾名思义,“ 长时间轮询” 意味着长时间轮询某些内容。 这是实际过程的开始,您对服务器上的某个脚本进行ajax调用,在本例中为,您需要使服务器脚本(例如)足够智能,以便仅在所需数据可用时才响应请求,该脚本应等待指定的时间