Time.sleep () influisce sulla risposta ZeroMQ poller.poll ()?

Oct 08 2020

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

1 user3666197 Oct 08 2020 at 21:58

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.