Mã sau gửi yêu cầu 200ms một lần và phải xử lý các phản hồi một cách không đồng bộ bất cứ khi nào chúng đến.Hành vi chặn lạ với gevent/grequests qua HTTPS
Trên HTTP, nó hoạt động như mong đợi - một yêu cầu được gửi mỗi 200ms và cuộc gọi trả lời được gọi độc lập bất cứ khi nào có phản hồi. Tuy nhiên, qua HTTPS, các yêu cầu bị trì hoãn đáng kể bất cứ khi nào một phản hồi đến (mặc dù trình xử lý phản hồi của tôi không hoạt động). Phản hồi gọi lại dường như được gọi hai lần cho mỗi yêu cầu, một lần với phản hồi có độ dài bằng không (chỉnh sửa: điều này là do chuyển hướng và dường như không liên quan đến vấn đề chặn, cảm ơn Padraic).
Điều gì có thể gây ra hành vi chặn này qua HTTPS? (www.bbc.co.uk
chỉ là một ví dụ về mặt địa lý xa tôi, nhưng nó xảy ra với tất cả các máy chủ tôi đã thử nghiệm).
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'
(kết quả mong đợi)
('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'
(yêu cầu được gửi cuối)
('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)
Lưu ý rằng phản hồi đầu tiên dường như đến lâu sau khi yêu cầu tiếp theo nên đã được gửi nhưng không. Tại sao giấc ngủ không quay lại, và yêu cầu tiếp theo được gửi đi, trước khi câu trả lời đầu tiên đến?
Ok, điều đó giải thích phản hồi độ dài 0. Bạn nói đúng, nó không xảy ra trên các tên miền khác. Bất kỳ ý tưởng về việc chặn? – akxlr