Python Lesen stream
Brauche ich eine sehr preiswert Lesen eines Puffers mit kein abschließendes string (stream) in Python. Dies ist, was ich habe, aber es verschwendet viel CPU-Zeit und Aufwand. Weil es ständig "versuchen und fangen." Ich brauche wirklich einen neuen Ansatz.
Hier ist eine reduzierte funktionierende version von meinem code:
#! /usr/bin/env/python
import fcntl, os, sys
if __name__ == "__main__":
f = open("/dev/urandom", "r")
fd = f.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
ready = False
line = ""
while True:
try:
char = f.read()
if char == '\r':
continue
elif char = '\n':
ready = True
else:
line += char
except:
continue
if ready:
print line
Nicht Befehl in das terminal. Es ist einfach zur illustration. "urandom" bricht Ihr terminal, weil es spuckt eine Menge von zufälligen Zeichen, dass der terminal-emulator interpretiert, egal was (die können Ihre aktuelle Schalen-Einstellungen, Titel, etc). Ich Las von einem gps über usb angeschlossen.
Das problem: diese nutzt 100% der CPU-Auslastung, wenn es kann. Ich habe dies ausprobiert:
#! /usr/bin/env/python
import fcntl, os, sys
if __name__ == "__main__":
f = open("/dev/urandom", "r")
fd = f.fileno()
fl = fcntl.fcntl(fd, fcntl.F_GETFL)
fcntl.fcntl(fd, fcntl.F_SETFL, fl | os.O_NONBLOCK)
for line in f.readlines():
print line
Allerdings bekomme ich IOError: [Errno 11] Resource temporarily unavailable
. Ich habe versucht, zu verwenden Popen
unter anderem. Ich bin an einem Verlust. Kann mir bitte jemand eine Lösung anbieten (und bitte alles erklären, ich bin kein pro, pro se). Ich sollte auch beachten, dass dies für Unix (insbesondere Linux, aber es muss tragbar sein für alle Versionen von Linux).
InformationsquelleAutor der Frage dylnmc | 2014-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werden Sie wollen, um Ihren buffering-Modus, um die Größe des chunks, die Sie Lesen möchten, wenn Sie die Datei öffnen stream.
Aus der python-Dokumentation:
Du auch mit dem lesbaren () - Methode in der while-Schleife, um zu vermeiden unnötigen Ressourcen-Verbrauch.
Jedoch empfehle ich Ihnen die Verwendung gepufferten streams wie
io.BytesIO
oderio.BufferedReader
Weitere Infos in der docs.
InformationsquelleAutor der Antwort Anoyz
Die einfachen Lösungen sind die besten:
Oder, alterantively
Hinweise:
Verlassen der Datei Deskriptor im blockierenden Modus, so dass die OS-block kann Ihren Prozess (spart CPU-Zeit), wenn keine Daten vorhanden sind.
Ist es wichtig, einen iterator in der Schleife. Betrachten
for line in f.readlines():
.f.readlines()
liest alle Daten aus und legt Sie alle in eine Liste und gibt diese Liste an. Da haben wir unendlich Datenf.readlines()
wird nie erfolgreich zurück. Im Gegensatz dazuf
gibt einen iterator -- es wird nur so viel Daten wie es Bedürfnisse zu befriedigen, die next-Schleife die iteration (und nur ein wenig mehr für ein performance-Puffer.)Die erste version liest Voraus und puffert genug Daten zu drucken, die mehrere Linien. Die zweite version gibt jede Zeile sofort. Verwenden Sie die erste version bei der Erhaltung der CPU ist das primäre Anliegen. Verwenden Sie die zweite, wenn der interaktive response-Zeit ist Ihr wichtigstes Anliegen.
Demonstration:
InformationsquelleAutor der Antwort Robᵩ
Entschied ich mich für io. Ich bemerkte, dass dieser viel genauer ist, als auch eine
while True:
. Die gps, ich lese aus soll ausspucken info jede Sekunde, aber ich merkte es war wirklich überall von .95 auf 1,05 Sekunden. Das war, wenn ich Tat, was ich geschrieben in meiner Frage.Jedoch, wenn ich einfach
Es nicht nur vorübergehend blockiert (die save-cpu-Zeit, und tut allerlei gutes), sondern auch anscheinend den buffer hält extrem up to date, denn es scheint um Ergebnisse zu erzielen fast genau eine Sekunde auseinander (was ist wenn meine gps - wie die meisten - updates).
Ein wahres Wunder, dass der Klasse ist - ein wahres Wunder - das ist, wenn es der einzige Weg, es zu tun wie diese. Man konnte einfach
open(file, "r")
und es funktioniert gut (das ärgert mich, denn ich verbrachte einen ganzen Tag auf dieser).InformationsquelleAutor der Antwort dylnmc