Python sys.stdin.read (max) blockiert bis max gelesen wird (wenn max = 0), blockt bis EOF else, aber select gibt an, dass Daten gelesen werden sollen

8

Mein Problem ist:

select gibt an, dass Daten gelesen werden sollen. Ich möchte lesen, was auch immer da ist. Ich möchte nicht warten, bis ein max -Menge vorhanden ist. Wenn max & lt; = 0, dann liest das Lesetest, bis EOF auftritt, wenn max & gt; 0 Blöcke liest, bis max Bytes gelesen werden können.

Ich will das nicht, ich möchte lesen was auch immer gemacht wird, wählen Sie es in die "Ready for reading" Liste. Lesen (1) ist nicht praktikabel, da dies viele Aufrufe zum Lesen beinhaltet. ABER es darf nicht blockieren.

Gibt es eine Möglichkeit, die im Puffer vorhandene Menge herauszufinden, wenn die Auswahl zurückkehrt (wenn sie zurückgibt, was anzeigt, dass etwas gelesen werden kann, statt das Zeitlimit überschritten zu haben) und diesen Betrag gelesen hat? Gibt es eine Möglichkeit, max wie mit Sockets zu verwenden? Wo es so viel wie möglich sofort liest, kehrt dann zurück?

Eine Lösung könnte darin bestehen, die Datei für den Lesevorgang in den nicht blockierenden Modus zu versetzen? Ich bin mir nicht sicher, dass ich dieses "bis zum EOF" Verhalten nicht erwartet habe.

Ich werde weiter lesen und versuchen, aber ich habe gerade 30 Minuten oder so verbracht und komme nicht näher, deshalb appelliere ich an dich.

HINWEIS

Es gibt eine Menge Fragen, wie man warten kann, bis ein Maximum an Input erreicht ist und die Dinge blockiert werden, bis der Max angekommen ist. Ich suche nicht danach. Mein Problem ist es ist blockieren.

Zusatz

setblocking(False) hat nicht funktioniert, ich lese nun, wie man es für die Dauer des Lesens nicht blockierend macht. Ich hoffe auf die Dokumentation:

%Vor%

Addendum II

Es scheint, dass read (0) eigentlich 0 liest, das ist nichts, das ergibt eine Endlosschleife, was interessant ist!

Es tut mir leid, dass ich es nicht wirklich versucht habe 0 Es scheint, ich habe mit 4096 angefangen (ich denke, es wird alles lesen, was es gibt ....), ohne Parameter, aber nicht mit 0.

Ich frage mich, welche Verwendung lesen (0) wäre?

Addendum III

Ich habe jetzt Probleme mit select (Ich habe versucht, read (1) als Lösung zu nehmen) Hier ist der eigentliche Code:

%Vor%

Es gibt wenige Dinge in der folgenden Ausgabe, die nichts damit zu tun haben, sie sind die "Hallo Welt!" das kommt fast sofort durch, und der "TEST!" etwa 5 Sekunden. Das "Hallo" ist etwas, das ich eingegeben habe, Eingabe, das "k" ist etwas, was ich später eingegeben habe, nachdem ich beides eingegeben habe, drücke Enter einmal.

Ausgabe:

%Vor%

Dies ist hier besser zu sehen: Ссылка

Was ist seltsam?

Es liest das "h" von hallo, aber liest nicht das "Hallo \ n", bis k passiert, es ist immer 1 Buchstabe vor 1 newline dahinter, wenn das Sinn macht.

Würden mehrere zu wählende Anrufe ein Problem verursachen? (In einem anderen Thread verwendet der Socket-Reader ebenfalls select)

Das Format für das Protokoll lautet:

* Zeit seit Programmstart

* Loglevel

* Thread-ID (einzigartig unter laufenden Threads)

* Protokoll-Tag

* Protokollnachricht

Was die Handler-Klasse tut

ist erlaubt Threads Nachrichten sicher miteinander zu posten, der Handler überprüft eine Warteschlange (und alle gebuchten Ereignisse passieren zu einer bestimmten Zeit, wie der TEST, der auf einem anderen Thread passiert, keine Sorge), der Post von "GetInput" schaltete einen weiteren Aufruf von GetInput ein und setzte ihn auf die Rückseite der Warteschlange. Die "OnInput" Nachricht wird an den Handler eines anderen Threads übergeben, den ich mit Eingabe beschäftigen möchte.

Ich habe es so gemacht, weil es eine gute Möglichkeit bietet, mit Threading umzugehen, und bedeutet, dass ich netten wiederverwendbaren Code habe (wie den SocketReadWriter), ich hoffe, dass dies nicht zu Kritik an meinem Threading-Modell führt, aber es funktioniert tatsächlich. Das Problem ist mit meinem Versuch, Benutzereingaben zu erhalten.

Sie können auch sehen, wenn ich ctrl + c mache, dass das Ding herunterfährt, das ist was die toClose-Sache tut. Wenn die Zeit abgelaufen ist, wenn es geschlossen werden soll, wird es. Ein Thread wird beendet, wenn er keine Handler mehr hat (Handler übernehmen nur, nachdem die Funktion, die der Thread ausführen soll, zurückgegeben hat, diese Funktion kann eine Klasse erzeugen, die einen Handler für ein Member hat, also wenn der Konstruktor zurückkehrt und die Funktion zurückkehrt , da ist ein Handler, der die Klasse am Leben hält)

Umgehen

%Vor%     
Alec Teal 21.09.2013, 20:34
quelle

1 Antwort

3

In os Modul gibt es os.read Funktion, die eine niedrigere Ebene erlaubt Kontrolle über das Lesen aus dem Dateideskriptor. Es ist nicht blockierend, solange mindestens ein Byte zum Lesen bereit ist.

%Vor%      

Liest höchstens n Bytes vom Dateideskriptor fd. Gibt eine Zeichenfolge zurück, die die gelesenen Bytes enthält. Wenn das Ende der Datei von fd bezeichnet wird   erreicht wurde, wird eine leere Zeichenfolge zurückgegeben.

     

Verfügbarkeit: Unix, Windows.

     

Hinweis: Diese Funktion ist für Low-Level-I / O vorgesehen und muss auf einen Dateideskriptor angewendet werden, der von os.open() oder pipe() zurückgegeben wird. Um ein "Dateiobjekt" zu lesen, das von der integrierten Funktion open() oder von popen() oder fdopen() oder sys.stdin zurückgegeben wird, verwenden Sie die Methoden read() oder readline() .

    
zch 21.09.2013, 22:38
quelle

Tags und Links