HTTPS

2016-03-27 15 views
9

पर gevent/grequests के साथ अजीब अवरोध व्यवहार निम्नलिखित कोड प्रत्येक 200ms के लिए अनुरोध भेजता है और जब भी वे आते हैं तो प्रतिक्रियाओं को असीमित रूप से संभालना चाहिए।HTTPS

HTTP पर यह अपेक्षा के अनुसार काम करता है - प्रत्येक 200ms का अनुरोध भेजा जाता है और जब भी कोई प्रतिक्रिया आती है तो प्रतिक्रिया कॉलबैक स्वतंत्र रूप से कॉल किया जाता है। हालांकि, HTTPS से अधिक, जब भी प्रतिक्रिया आती है तो अनुरोधों में काफी देरी हो जाती है (भले ही मेरा प्रतिक्रिया हैंडलर कोई काम न करे)। प्रतिक्रिया कॉलबैक प्रत्येक अनुरोध के लिए दो बार कहा जाता है, एक बार शून्य-लंबाई प्रतिक्रिया के साथ (संपादित करें: यह एक पुनर्निर्देशन के कारण है और अवरोधक मुद्दे से संबंधित नहीं लगता है, धन्यवाद Padraic)।

HTTPS पर इस अवरोध व्यवहार का कारण क्या हो सकता है? (www.bbc.co.uk सिर्फ एक उदाहरण है जो भौगोलिक रूप से मुझसे दूर है, लेकिन यह परीक्षण किए गए सभी सर्वरों के साथ होता है)।

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' (अपेक्षित परिणाम)

('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' (अनुरोध देर भेजा जाता है)

('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) 

ध्यान दें कि अगला अनुरोध अगले अनुरोध के बाद लंबे समय तक पहुंचने लगता है भेजा गया था लेकिन नहीं था। नींद की वापसी क्यों नहीं हुई, और अगला अनुरोध भेजा गया, इससे पहले कि पहली प्रतिक्रिया आ गई?

उत्तर

1

grequests की वर्तमान यात्रा निम्नलिखित शामिल हैं। मुझे यकीन नहीं है कि क्या इसका दुष्प्रभाव है।

1

अतिरिक्त प्रतिक्रियाओं और 0 लंबाई प्रतिक्रियाओं को आसानी से समझाया गया है कि यदि आप एक print(res.status_code) आप https://www.bbc.co.uk के मामले आप http://www.bbc.co.uk पर पुनः निर्देशित करने के रूप में 301 के का एक बहुत देखेंगे जोड़ सकते हैं ताकि कारण है कि आप अतिरिक्त प्रतिक्रियाएं और 0 लौटे देखना len(res.text) के लिए, आप नीचे दिए गए उत्पादन देख सकते हैं:

In [11]: def cb(res, **kwargs): 
    ....:   print(res.status_code) 
    ....:   print("**** Response", time.time(), len(res.text)) 
    ....:  

In [12]: for i in range(10): 
    ....:   unsent = grequests.get("https://www.bbc.co.uk", hooks={'response': cb}) 
    ....:   print("Request", time.time()) 
    ....:   grequests.send(unsent, grequests.Pool(1)) 
    ....:   gevent.sleep(0.2) 
    ....: gevent.sleep(5) 
    ....: 
('Request', 1459368704.32843) 
301 
('**** Response', 1459368704.616453, 0) 
('Request', 1459368704.618786) 
301 
('**** Response', 1459368704.937159, 0) 
('Request', 1459368704.941069) 
200 
('**** Response', 1459368704.943034, 141486) 
301 
('**** Response', 1459368705.496423, 0) 
('Request', 1459368705.498991) 
200 
('**** Response', 1459368705.50162, 141448) 
301 
('**** Response', 1459368705.784145, 0) 
('Request', 1459368705.785769) 
200 
('**** Response', 1459368705.786772, 141486) 
301 
('**** Response', 1459368706.110865, 0) 
('Request', 1459368706.114921) 
200 
('**** Response', 1459368706.116124, 141448) 
301 
('**** Response', 1459368706.396807, 0) 
('Request', 1459368706.400795) 
200 
301 
('**** Response', 1459368706.756861, 0) 
('Request', 1459368706.76069) 
200 
('**** Response', 1459368706.763268, 141448) 
('**** Response', 1459368706.488708, 141448) 
301 
('**** Response', 1459368707.065011, 0) 
('Request', 1459368707.069128) 
200 
('**** Response', 1459368707.071981, 141448) 
301 
('**** Response', 1459368707.366737, 0) 
('Request', 1459368707.370713) 
200 
('**** Response', 1459368707.373597, 141448) 
301 
('**** Response', 1459368707.73689, 0) 
200 
('**** Response', 1459368707.743815, 141448) 
200 
('**** Response', 1459368707.902499, 141448) 

हम एक साइट है कि https पर कार्य करता है, https://www.google.ie/ इस उदाहरण में उपयोग करते हुए एक ही कोड चलाते हैं:

In [14]: for i in range(10): 
    ....:   unsent = grequests.get("https://www.google.ie/", hooks={'response': cb}) 
    ....:   print("Request", time.time()) 
    ....:   grequests.send(unsent, grequests.Pool(1)) 
    ....:   gevent.sleep(0.2) 
    ....: gevent.sleep(5) 
    ....: 
('Request', 1459368895.525717) 
200 
('**** Response', 1459368895.838453, 19682) 
('Request', 1459368895.884151) 
200 
('**** Response', 1459368896.168789, 19650) 
('Request', 1459368896.22553) 
200 
('**** Response', 1459368896.491304, 19632) 
('Request', 1459368896.542206) 
200 
('**** Response', 1459368896.808875, 19650) 
('Request', 1459368896.850575) 
200 
('**** Response', 1459368897.144725, 19705) 
('Request', 1459368897.173744) 
200 
('**** Response', 1459368897.45713, 19649) 
('Request', 1459368897.491821) 
200 
('**** Response', 1459368897.761675, 19657) 
('Request', 1459368897.792373) 
200 
('**** Response', 1459368898.331791, 19683) 
('Request', 1459368898.350483) 
200 
('**** Response', 1459368898.836108, 19713) 
('Request', 1459368898.855729) 
200 
('**** Response', 1459368899.148171, 19666) 

आप देखेंगे कि व्यवहार अलग है। हमें 10 प्रतिक्रियाएं मिलती हैं और 0 लंबाई प्रतिक्रियाएं नहीं मिलती हैं। आप जो चाहते हैं उसे प्राप्त करने के लिए आपको अपने फ़ंक्शन में status_code की जांच करनी चाहिए। ऊपर दिया गया उदाहरण बताता है कि आप बीबीसी साइट के लिए क्या देखते हैं और अधिकतर दूसरों के लिए क्या हो रहा है। इस को हटाने या मैन्युअल monkey.patch_select() बुला समस्या का हल -

from gevent import monkey as curious_george 
curious_george.patch_all(thread=False, select=False) 

हमलावर भाग select=False है:

+0

ठीक है, जो 0 लंबाई प्रतिक्रियाओं को बताता है। आप सही हैं, यह अन्य डोमेन पर नहीं होता है। अवरुद्ध करने के बारे में कोई विचार? – akxlr