Python sockets Pufferung
Sagen wir, ich will eine Zeile Lesen von einem socket, unter Verwendung der standard - socket
Modul:
def read_line(s):
ret = ''
while True:
c = s.recv(1)
if c == '\n' or c == '':
break
else:
ret += c
return ret
Was genau passiert in s.recv(1)
? Wird es Problem ein system rufen jedes mal? Ich glaube, ich sollte hinzufügen, dass einige der Pufferung sowieso:
Für die beste übereinstimmung mit hardware-und Netzwerk-Realitäten, die Wert bufsize sollten eine relativ kleine Potenz von 2, Z. B. 4096.
http://docs.python.org/library/socket.html#socket.socket.recv
Aber es scheint nicht einfach zu schreiben effiziente und thread-sicheren Puffern. Was, wenn ich file.readline()
?
# does this work well, is it efficiently buffered?
s.makefile().readline()
InformationsquelleAutor der Frage Bastien Léonard | 2009-05-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
recv()
Aufruf erfolgt direkt durch den Aufruf der C-library-Funktion.Blockiert das warten auf die socket-Daten haben. In der Realität wird es nur lassen Sie die
recv()
system-call-block.file.readline()
ist eine effiziente gepufferte Umsetzung. Es ist nicht threadsicher, weil es voraussetzt, es ist nur ein Lesen der Datei ist. (Zum Beispiel durch die Pufferung kommenden Eingang.)Wenn Sie über das Datei-Objekt, jeder Zeit
read()
heißt mit einem positiven argument, der zugrunde liegende code wirdrecv()
nur die Menge der angeforderten Daten, es sei denn, es ist bereits gepuffert.Wäre es gepuffert werden, wenn:
Ihnen genannt hatte readline () liest eine volle Puffer
Ende der Linie war, bevor das Ende des Puffers
Damit die Daten im Puffer. Ansonsten ist der Puffer ist in der Regel nicht überfüllt.
Dem Ziel, die Frage ist nicht klar. wenn Sie brauchen, um zu sehen, ob Daten verfügbar sind, bevor Sie Lesen, können Sie
select()
oder legen Sie die Buchse auf nicht blockierenden Modus mits.setblocking(False)
. Dann liest wird leer zurückkehren, sondern als blockiert, wenn es kein warten auf die Daten.Lesen Sie eine Datei oder ein socket mit mehreren threads? Ich würde von einer einzigen Person auf das Lesen der Buchse und Fütterung erhalten die Elemente in einer Warteschlange für die Bearbeitung durch andere threads.
Vorschlagen, consulting Python-Socket-Modul Quelle und C-Quelle, macht das system fordert.
InformationsquelleAutor der Antwort Joe Koberg
Wenn man sich mit Leistung und Kontrolle die Buchse komplett
(Sie werden nicht übergeben, es in einer Bibliothek zum Beispiel), dann versuchen Sie umzusetzen
Ihre eigene Pufferung in Python -- Python-string.finden und string.split und wie kann
werden erstaunlich schnell.
Wenn Sie erwarten, dass die Nutzlast besteht aus Linien
- nicht zu riesig, das Sie ausführen sollten, ziemlich schnell,
und vermeiden Sie springen durch zu viele Ebenen von Funktion
Anrufe unnötig. Ich würde interessant sein zu wissen
wie diese im Vergleich zu Datei.readline() oder mit sockel.recv(1).
InformationsquelleAutor der Antwort Aaron Watters
InformationsquelleAutor der Antwort alex