Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Czytanie ze stdin opóźnia linię na stdout

8 views
Skip to first unread message

Mikoskay

unread,
Nov 16, 2008, 2:51:16 PM11/16/08
to
Witam,

Mam mały problem, który ilustruje ten programik - w założeniu
implementacja I/O multiplexing (jakkolwiek się to na polski tłumaczy):

http://pastebin.pl/3516

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,

Marek Wywiał

unread,
Nov 16, 2008, 5:25:30 PM11/16/08
to

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:

Mikoskay

unread,
Nov 17, 2008, 12:58:44 AM11/17/08
to

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...

Artur M. Piwko

unread,
Nov 17, 2008, 2:32:02 AM11/17/08
to
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()

--
[ 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!

Rob Wolfe

unread,
Nov 17, 2008, 3:07:03 AM11/17/08
to

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

Mikoskay

unread,
Nov 17, 2008, 2:54:38 PM11/17/08
to
On 17 Lis, 09:07, Rob Wolfe <r...@smsnet.pl> wrote:
> Artur M. Piwko napisał(a):
>
>
>
> > In the darkest hour on Sun, 16 Nov 2008 11:51:16 -0800 (PST),
> > Mikoskay <mikos...@gmail.com> screamed:

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,

0 new messages