Lesen-streaming http-Antwort mit Python "Anfragen" - Bibliothek
Ich versuche zu konsumieren, einen event-stream zur Verfügung gestellt von der Kubernetes
api mithilfe der requests
Modul. Ich habe laufen in das, was aussieht wie ein
problem der Pufferung: die requests
Modul scheint auch zu hinken, indem Sie ein Ereignis.
Ich habe code, der ungefähr so aussieht:
r = requests.get('http://localhost:8080/api/v1beta1/watch/services',
stream=True)
for line in r.iter_lines():
print 'LINE:', line
Als Kubernetes strahlt Ereignisbenachrichtigungen, dieser code wird nur angezeigt
das Letzte Ereignis wird ausgegeben, wenn ein neues event kommt, die macht es
fast völlig nutzlos code, die Bedürfnisse zu reagieren service
hinzufügen/löschen von Veranstaltungen.
Habe ich dies Problem gelöst, indem Sie laichen curl
im Teilprozess anstatt
die requests
Bibliothek:
p = subprocess.Popen(['curl', '-sfN',
'http://localhost:8080/api/watch/services'],
stdout=subprocess.PIPE,
bufsize=1)
for line in iter(p.stdout.readline, b''):
print 'LINE:', line
Dies funktioniert, aber auf Kosten der Flexibilität geht. Gibt es eine Möglichkeit,
vermeiden Sie dieses problem der Pufferung mit der requests
Bibliothek?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieses Verhalten ist aufgrund von einen buggy Umsetzung des
iter_lines
Methode in der
requests
Bibliothek.iter_lines
iteriert über die response-Inhalte inchunk_size
Blöckeder Daten über die
iter_content
iterator. Wenn es weniger alschunk_size
bytes zum Lesen verfügbaren Daten aus der remoteserver (was normalerweise der Fall sein, wenn das Lesen der letzten Zeile
Ausgabe), die read-operation blockiert, bis
chunk_size
bytesDaten sind verfügbar.
Ich geschrieben habe, meine eigenen
iter_lines
- routine, die funktioniert:Dies funktioniert, weil
os.read
zurück weniger alschunk_size
bytesDaten, anstatt zu warten, für einen Puffer zu füllen.