time.sleep是否会影响ZeroMQ poller.poll响应?

问题描述

通过轮询发出ZeroMQ - task: PublishTestResults@2 inputs: testResultsFormat: 'JUnit' testResultsFiles: '**/*-junit.xml' searchFolder: '$(Common.TestResultsDirectory)' 请求时,我得到的结果无法解释。

REQ/REP方法所花费的时间受代码中其他地方的poll()影响。

我有一个运行命令的服务器进程,并返回进程的time.sleep()。这是有问题的请求方代码:

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(在这种情况下它很快),所以:

pid

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

sleep = 0.5

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

sleep = 1.5

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

问题是,sleep = 0为什么会影响ZeroMQ time.sleep()花费的时间?

解决方法

该代码按原样将苹果与橙子混合:

time.time() 返回自纪元以来的秒,为 float ,即 ( time.time() - start )*1000 产生多少{ {1}}毫秒,是测试中的代码段实际花费的时间。

[ms] 方法的 poller.poll() 期望毫秒数,因此请求的timeout使{{1} }-实例等待并保持,直到30000 [ms]过去或与消息到达相关的poller-事件允许更早地前进到任何地方。

这就是说,您的测量方法不是探索30 [s]方法,而是探索由外部过程随机获取的时间间隔,该过程会将 zmq.POLLIN 端的答案发送给 .sleep() -侧REP-s。

仍然有疑问吗?将睡眠时间设置为 REQ ,您应该收到格式错误的本地时间段报告的持续时间几乎为零(请确保,当且仅当远程.send()所在的实体确实这样做了)不会在这样的操作中死机。

您可能还喜欢具有31 [s]方法的REP类,它为使用ZeroMQ本机zmq.Stopwatch-resolution-clock提供了一个智能工具。我的大部分posts on ZeroMQ表演都将其用于微基准测试。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...