Il seguente codice invia una richiesta ogni 200 ms e dovrebbe gestire le risposte in modo asincrono ogni volta che vengono.Strano comportamento di blocco con gevent/grequests su HTTPS
Su HTTP funziona come previsto - una richiesta viene inviata ogni 200 ms e la richiamata della risposta viene chiamata indipendentemente ogni volta che arriva una risposta. Su HTTPS, tuttavia, le richieste vengono significativamente ritardate ogni volta che arriva una risposta (anche se il mio gestore di risposta non funziona). Il callback della risposta sembra essere chiamato due volte per ogni richiesta, una volta con una risposta di lunghezza zero (edit: questo è a causa di un reindirizzamento e sembra non correlato al problema del blocco, grazie Padraic).
Che cosa potrebbe causare questo comportamento di blocco su HTTPS? (www.bbc.co.uk
è solo un esempio geograficamente lontano da me, ma succede con tutti i server che ho testato).
grequests_test.py
import time
import sys
import grequests
import gevent
def cb(res, **kwargs):
print("**** Response", time.time(), len(res.text))
for i in range(10):
unsent = grequests.get(sys.argv[1], hooks={'response': cb})
print("Request", time.time())
grequests.send(unsent, grequests.Pool(1))
gevent.sleep(0.2)
gevent.sleep(5)
$ ipython2 grequests_test.py 'http://www.bbc.co.uk'
(risultato atteso)
('Request', 1459050191.499266)
('Request', 1459050191.701466)
('Request', 1459050191.903223)
('Request', 1459050192.10403)
('Request', 1459050192.305626)
('**** Response', 1459050192.099185, 179643)
('Request', 1459050192.506476)
('**** Response', 1459050192.307869, 179643)
('Request', 1459050192.707745)
('**** Response', 1459050192.484711, 179643)
('Request', 1459050192.909376)
('**** Response', 1459050192.696583, 179643)
('Request', 1459050193.110528)
('**** Response', 1459050192.870476, 179643)
('Request', 1459050193.311601)
('**** Response', 1459050193.071679, 179639)
('**** Response', 1459050193.313615, 179680)
('**** Response', 1459050193.4959, 179643)
('**** Response', 1459050193.687054, 179680)
('**** Response', 1459050193.902827, 179639)
ipython2 grequests_test.py 'https://www.bbc.co.uk'
(richieste vengono inviate in ritardo)
('Request', 1459050203.24336)
('Request', 1459050203.44473)
('**** Response', 1459050204.423302, 0)
('Request', 1459050204.424748) <------------- THIS REQUEST TIME IS LATE
('**** Response', 1459050205.294426, 0)
('Request', 1459050205.296722)
('Request', 1459050205.497924)
('**** Response', 1459050206.456572, 0)
('Request', 1459050206.457875)
('**** Response', 1459050207.363188, 0)
('**** Response', 1459050208.247189, 0)
('Request', 1459050208.249579)
('**** Response', 1459050208.250645, 179643)
('**** Response', 1459050208.253638, 179643)
('Request', 1459050208.451083)
('**** Response', 1459050209.426556, 0)
('Request', 1459050209.428032)
('**** Response', 1459050209.428929, 179643)
('**** Response', 1459050210.331425, 0)
('**** Response', 1459050211.247793, 0)
('Request', 1459050211.251574)
('**** Response', 1459050211.252321, 179643)
('**** Response', 1459050211.25519, 179680)
('**** Response', 1459050212.397186, 0)
('**** Response', 1459050213.299109, 0)
('**** Response', 1459050213.588854, 179588)
('**** Response', 1459050213.590434, 179643)
('**** Response', 1459050213.593731, 179643)
('**** Response', 1459050213.90507, 179643)
('**** Response', 1459050213.909386, 179643)
Si noti che la prima risposta sembra arrivare molto dopo la richiesta successiva se è stata inviata ma non è stata inviata. Perché il sonno non è tornato e la richiesta successiva è stata inviata prima che arrivasse la prima risposta?
Ok, questo spiega le risposte di lunghezza 0. Hai ragione, non succede su altri domini. Qualche idea sul blocco? – akxlr