Mam mały problem, który ilustruje ten programik - w założeniu
implementacja I/O multiplexing (jakkolwiek się to na polski tłumaczy):
Kod jest krótki i czytelny, ale na wszelki wypadek wyjaśniam: program
tworzy wątek sprawdzający czy jest coś na wejściu, a jeśli jest to
wrzucający to do kolejki wejścia. Następnie rozpoczynana jest pętla
powtarzana co 0.5 sekundy podczas której, jeżeli w kolejce wejścia coś
jest, jest to "przetwarzane".
Problem w drukowaniu linii "Prompt line". Przykładowe działanie:
--------------------------------------------------------
Linia: Hello!
First line
Second line
Prompt line: <pierwsze wejscie>
Linia: <pierwsze wejscie>
First line
Second line
<drugie wejscie>
Prompt line: Linia: <drugie wejscie>
First line
Second line
--------------------------------------------------------
Jak widać, za drugim razem prompt jest wyświetlany... dopiero po
podaniu czegoś na wejście! I tu moje pytanie: dlaczego? I co zrobić
żeby działało jak ma działać?
Z góry dzięki za pomoc,
Prompt line wyświetla sie wtedy gdy jest podana 'line'.
za pierwszym razem sztucznie wymuszasz istnienie linii 'line =
"Hello!"'
dlatego dostajesz prompt,
potem jest line = None więc drugi przebieg czeka na linie (while), i
dopiero po podaniu trafia
do if line:
Z tym warunkiem chodzi o to, żeby po odebraniu jakiejś linii, a nie co
0.5 sekundy, wyświetlić nowy prompt. A drukowanie First line i Second
line jest uwarunkowane dokładnie tak samo, a jednak są drukowane...
Wyświetlasz linię bez NL i bufor się jeszcze nie przepełnił.
Zmień:
sys.stdout.write("Prompt line: ")
Na:
sys.stdout.write("Prompt line: ")
sys.stdout.flush()
--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:225B ]
[ 08:29:59 user up 11894 days, 20:24, 1 user, load average: 0.86, 0.01, 0.72 ]
It said, "Insert disk #3," but only two will fit!
Artur M. Piwko napisał(a):
> In the darkest hour on Sun, 16 Nov 2008 11:51:16 -0800 (PST),
> Mikoskay <miko...@gmail.com> screamed:
> > Kod jest krótki i czytelny, ale na wszelki wypadek wyjaśniam: program
> > tworzy wątek sprawdzający czy jest coś na wejściu, a jeśli jest to
> > wrzucający to do kolejki wejścia. Następnie rozpoczynana jest pętla
> > powtarzana co 0.5 sekundy podczas której, jeżeli w kolejce wejścia coś
> > jest, jest to "przetwarzane".
> >
> > Problem w drukowaniu linii "Prompt line". Przykładowe działanie:
> [...]
> > Jak widać, za drugim razem prompt jest wyświetlany... dopiero po
> > podaniu czegoś na wejście! I tu moje pytanie: dlaczego? I co zrobić
> > żeby działało jak ma działać?
>
> Wyświetlasz linię bez NL i bufor się jeszcze nie przepełnił.
>
> Zmień:
>
> sys.stdout.write("Prompt line: ")
>
> Na:
>
> sys.stdout.write("Prompt line: ")
> sys.stdout.flush()
>
Dodam tylko, ze to zachowanie nie jest specyficzne dla Pythona
i zalezy wprost od implementacji systemowej "libc".
http://www.gnu.org/software/libtool/manual/libc/Flushing-Buffers.html
RW
Cóż, pomimo, iż faktycznie jest to zależne od libc, to z cstdio.h
nigdy nie miałem przyjemności poznać tego problemu. A mówią, że to
Python jest na wyższym poziomie abstrakcji. :)
Dziękuję wszystkim - odpowiedź satysfakcjonująca i jeszcze z ciekawym
przypisem.
Pozdrawiam,