time.sleep() 是否影响 ZeroMQ poller.poll() 响应?
Is time.sleep() impacting the ZeroMQ poller.poll() response?
我在使用轮询发出 ZeroMQ REQ/REP
请求时得到无法解释的结果。
poll()
方法获取的经过时间受代码中其他地方的 time.sleep()
影响。
我有一个运行命令的服务器进程,returns 进程的 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
sleep = 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
sleep = 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()
会影响 ZeroMQ poller.poll()
所花费的时间?
代码as-is将苹果与橙子混合:
time.time()
returns 自纪元以来的秒数为 float
,即 ( time.time() - start )*1000
得出被测 code-section 实际花费了多少 [ms]
毫秒。
而 poller.poll()
-方法需要毫秒,因为它是 timeout
,所以请求的 30000 [ms]
使 poller
-实例等待并保持,直到 30 [s]
过去或 message-arrival 相关的 zmq.POLLIN
-事件允许提前到任何地方。
这就是说,您的测量探索的不是 .sleep()
方法,而是外部进程随机获取的间隔,它发送 REP
端REQ
-side .send()
-s.
的答案
还在疑惑?将睡眠时间设置为 31 [s]
并且您应该从 ill-formulated 本地 time-bracket 收到几乎为零的持续时间报告(当然,当且仅当远程 REP
-说谎的实体在此类操作中没有崩溃或窒息。
您可能还喜欢 zmq.Stopwatch
class,具有 { .start(), .stop() }
方法,它提供了使用 ZeroMQ 本机的智能工具 [us]
-resolution-clock .我的大部分 posts on ZeroMQ 性能都将其用于微基准测试。
我在使用轮询发出 ZeroMQ REQ/REP
请求时得到无法解释的结果。
poll()
方法获取的经过时间受代码中其他地方的 time.sleep()
影响。
我有一个运行命令的服务器进程,returns 进程的 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
sleep = 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
sleep = 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()
会影响 ZeroMQ poller.poll()
所花费的时间?
代码as-is将苹果与橙子混合:
time.time()
returns 自纪元以来的秒数为 float
,即 ( time.time() - start )*1000
得出被测 code-section 实际花费了多少 [ms]
毫秒。
而 poller.poll()
-方法需要毫秒,因为它是 timeout
,所以请求的 30000 [ms]
使 poller
-实例等待并保持,直到 30 [s]
过去或 message-arrival 相关的 zmq.POLLIN
-事件允许提前到任何地方。
这就是说,您的测量探索的不是 .sleep()
方法,而是外部进程随机获取的间隔,它发送 REP
端REQ
-side .send()
-s.
还在疑惑?将睡眠时间设置为 31 [s]
并且您应该从 ill-formulated 本地 time-bracket 收到几乎为零的持续时间报告(当然,当且仅当远程 REP
-说谎的实体在此类操作中没有崩溃或窒息。
您可能还喜欢 zmq.Stopwatch
class,具有 { .start(), .stop() }
方法,它提供了使用 ZeroMQ 本机的智能工具 [us]
-resolution-clock .我的大部分 posts on ZeroMQ 性能都将其用于微基准测试。