如何解决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表演都将其用于微基准测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。