Seltsames Blockierungsverhalten mit gevent / grequests über HTTPS

9

Der folgende Code sendet eine Anfrage alle 200 ms und sollte die Antworten asynchron behandeln, wann immer sie kommen.

Über HTTP funktioniert es wie erwartet - eine Anfrage wird alle 200ms gesendet und der Antwort-Callback wird unabhängig aufgerufen, wenn eine Antwort eintrifft. Über HTTPS werden die Anforderungen jedoch immer dann signifikant verzögert, wenn eine Antwort eintrifft (obwohl mein Antworthandler nicht funktioniert). Der Antwort-Callback scheint für jede Anfrage zweimal aufgerufen zu werden, einmal mit einer Antwort der Länge Null (edit: Dies ist wegen einer Weiterleitung und scheint nichts mit dem Blockierungsproblem zu tun, danke Padraic).

Was könnte dieses Blockierungsverhalten über HTTPS verursachen? ( www.bbc.co.uk ist nur ein Beispiel, das geografisch weit von mir entfernt ist, aber es passiert bei allen Servern, die ich getestet habe).

grequests_test.py

%Vor%

$ ipython2 grequests_test.py 'http://www.bbc.co.uk' (erwartetes Ergebnis)

%Vor%

ipython2 grequests_test.py 'https://www.bbc.co.uk' (Anfragen werden spät gesendet)

%Vor%

Beachten Sie, dass die erste Antwort lange nach der nächsten Anforderung erscheint sollte gesendet wurde, aber nicht. Warum kam der Schlaf nicht zurück und die nächste Anfrage wurde gesendet, bevor diese erste Antwort eintraf?

    
akxlr 27.03.2016, 04:06
quelle

2 Antworten

1

Die aktuelle Iteration von grequests enthält Folgendes:

%Vor%

Der problematische Teil ist select=False - das Entfernen dieses oder das manuelle Aufrufen von monkey.patch_select() löst das Problem. Ich bin mir nicht sicher, ob dies andere Nebenwirkungen hat.

    
akxlr 31.03.2016, 09:54
quelle
1

Die zusätzlichen Antworten und die Antworten mit der Länge 0 sind leicht zu erklären, wenn Sie print(res.status_code) hinzufügen, werden Sie viele 301 sehen, wie im Fall von https://www.bbc.co.uk werden Sie auf http://www.bbc.co.uk umgeleitet, deshalb sehen Sie Extras Antworten und 0 zurückgegeben für die len(res.text) , können Sie die folgende Ausgabe sehen:

%Vor%

Wenn wir denselben Code unter Verwendung einer Site verwenden, die über https, https://www.google.ie/ in diesem Beispiel dient:

%Vor%

Sie werden sehen, dass das Verhalten anders ist. Wir erhalten 10 Antworten und keine 0 length Antworten. Sie sollten das status_code in Ihrer Funktion prüfen, um zu überprüfen, dass Sie bekommen, was Sie wollen. Das obige Beispiel erklärt, was Sie für die BBC-Site sehen und höchstwahrscheinlich was für die anderen passiert.

    
Padraic Cunningham 30.03.2016 20:12
quelle