Lassen Sie uns sagen, dass ich eine Linie von einem Socket lesen möchten, die Standard-socket
Modul:Python-Buchsen Pufferung
def read_line(s):
ret = ''
while True:
c = s.recv(1)
if c == '\n' or c == '':
break
else:
ret += c
return ret
Was in s.recv(1)
genau passiert? Wird es jedes Mal einen Systemaufruf auslösen? Ich denke, ich soll eine gewissen Puffer hinzufügen, trotzdem:
Für beste Übereinstimmung mit Hardware und Netzwerk Realitäten, der Wert von bufsize sollte eine relativ geringe Potenz von 2 sein, zum Beispiel, 4096.
http://docs.python.org/library/socket.html#socket.socket.recv
Aber es scheint nicht einfach zu schreiben effiziente und thread-sichere Pufferung. Was passiert, wenn ich file.readline()
verwende?
# does this work well, is it efficiently buffered?
s.makefile().readline()
"Gibt es jedes Mal einen Systemaufruf?" Warum ist das wichtig? –
Weil Systemaufrufe langsam sind. Es ist besser, einen großen Datenblock (falls verfügbar) zu holen und dann zu verarbeiten. Jetzt weiß ich, dass Python nicht besonders schnell ist, und vielleicht ist das nicht wirklich wichtig. Aber die Dokumentation sagt, dass es sowieso besser ist, große Teile zu lesen. –
Beachten Sie, dass das Erstellen eines Strings mit '+ =' ein No-No ist, da es potentiell quadratisch ist, während das Erstellen einer Liste mit append die Verwendung von 'str.join' am Ende immer linear ist. –