ho una risposta HTTP da urllibflusso non bloccante che supporta cercare di risposta HTTP in Python
response = urllib2.urlopen('http://python.org/')
Alla fine, voglio essere in grado di seek()
all'interno della risposta (almeno all'inizio). Allora voglio essere in grado di avere codice come questo:
print result.readline()
result.seek(0)
print result.readline()
La soluzione più semplice a questo problema è StringIO
o io.BytesIO
come questo:
result = io.BytesIO(response.read())
Tuttavia, il fatto è che le risorse voglio la richiesta tende ad essere molto grande e voglio iniziare a lavorare con loro (analisi ...) prima che l'intero download sia finito. response.read()
sta bloccando. Sto cercando una soluzione non bloccante.
Il codice ideale sarebbe read(BUFFER_SIZE)
dalla risorsa e ogni volta che è necessario più contenuto, è sufficiente richiedere più dalla risposta. Sto fondamentalmente cercando una classe wrapper in grado di farlo. Oh, e ho bisogno di un file come oggetto.
ho pensato, potrei scrivere qualcosa di simile:
base = io.BufferedIOBase(response)
result = io.BufferedReader(base)
Tuttavia, si scopre che questo non funziona e ho cercato classi diverse dalla io module ma non ha potuto farlo funzionare. Sono felice con qualsiasi classe wrapper che abbia il comportamento desiderato.
1. Si utilizza 'readline()' che potrebbe potenzialmente leggere l'intera risposta se non ci sono interruzioni di riga. 2. Si dovrebbe verificare se la dimensione dei dati già salvati ** più ** la dimensione della riga da salvare non superi 'buffer_size' altrimenti si rischia di buffering più di' buffer_size'. –
@Piotr Dobrogost Grazie per averlo indicato. Il codice non è completo e non è sicuramente sicuro. Manca read() e inoltre non supporta le risposte dal modulo delle richieste. Tuttavia, serve allo scopo. – dominik