Time.sleep () influisce sulla risposta ZeroMQ poller.poll ()?
Sto ottenendo risultati che non riesco a spiegare quando effettuo una REQ/REPrichiesta ZeroMQ con polling.
Il tempo trascorso, preso dal poll()-method, è influenzato da un time.sleep()altrove nel codice.
Ho un processo del server che esegue un comando e restituisce il piddel processo. Questo è il codice lato richiesta che presenta il problema:
importa 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}
per i nell'intervallo (4):
time.sleep (sleeptime)
socket.send_json (richiesto)
inizio = ora.ora ()
calzini = dict ((poller.poll (30000)))
trascorso = (time.time () - start) * 1000
rep = socket.recv_json ()
log_msg ('pid = {0}, sleep = {1}, tempo impiegato = {2}'. format (rep ['pid'], sleeptime, int (trascorso)))
Il tempo trascorso del primo sondaggio è abbastanza variabile, ma tutti i successivi impiegano circa 2 secondi in meno rispetto allo sleep time, a meno che lo sleep time non sia 0, nel qual caso è veloce, quindi:
sleep = 0.5 :
20201008_08: 27: 24.168800, pid = 52528, sleep = 0,5, tempo impiegato = 505 20201008_08: 27: 26.210196, pid = 52529, sleep = 0,5, tempo impiegato = 1540 20201008_08: 27: 28.250891, pid = 52530, sleep = 0,5, tempo impiegato = 1539 20201008_08: 27: 30.295036, pid = 52531, sleep = 0,5, tempo impiegato = 1543
sleep = 1.5 :
20201008_08: 44: 02.474492, pid = 54730, sleep = 1.5, tempo impiegato = 295 20201008_08: 44: 04.516844, pid = 54731, sleep = 1.5, tempo impiegato = 540 20201008_08: 44: 06.557980, pid = 54732, sleep = 1.5, tempo impiegato = 539 20201008_08: 44: 08.599717, pid = 54733, sleep = 1.5, tempo impiegato = 539
sleep = 0 :
20201008_08: 27: 13.999147, pid = 52513, sleep = 0.0, tempo impiegato = 690 20201008_08: 27: 14.033915, pid = 52514, sleep = 0.0, tempo impiegato = 34 20201008_08: 27: 14.068803, pid = 52515, sleep = 0.0, tempo impiegato = 34 20201008_08: 27: 14.103947, pid = 52516, sleep = 0.0, tempo impiegato = 34
Quindi la domanda è: perché time.sleep()influisce sul tempo impiegato dallo ZeroMQ poller.poll()?
Risposte
Il codice così com'è mescola mele con arance:
time.time()restituisce i secondi dall'epoca come float, cioè ( time.time() - start )*1000restituisce quanti [ms]millisecondi ha effettivamente impiegato la sezione di codice sotto test.
Considerando che il poller.poll()-method si aspetta millisecondi per esso timeout, quindi la richiesta 30000 [ms]fa in modo che l' polleristanza attenda e tenga fino allo 30 [s]scadere o che un zmq.POLLINevento correlato all'arrivo di un messaggio permetta di andare avanti ovunque prima.
Detto questo, la tua misurazione non esplora il .sleep()metodo, ma gli intervalli presi a caso da un processo esterno, che invia REPrisposte REQ-side a -side .send()-s.
Ancora in dubbio? Imposta il tempo di sonno a 31 [s]e dovresti ricevere quasi zero durate riportate da una fascia oraria locale mal formulata (certo, se e solo se l' REPentità remota non si è schiantata o soffocata durante tali operazioni).
Potresti anche apprezzare la zmq.Stopwatchclasse, con { .start(), .stop() }metodi che forniscono uno strumento intelligente per l'utilizzo di un clock a risoluzione nativa [us]ZeroMQ. La maggior parte dei miei post sulle prestazioni di ZeroMQ lo utilizza per il microbenchmarking.