Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Не буффиризированный вывод


Автор: BurnerCode 16.4.2008, 09:56
Хочу понять почему в данном сценарии по разному работаю операторы print с отключенной буфферизацией и syswrite который по дефолту не использует буфферизированый вывод.

Код

#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes('sleep');

$|++;

open(FH, "< domains") or die "$!";
open(KNIFE, "| ./knife.pl") or die "$!";
while(<FH>)
{
    sleep(0.1);
    chomp;
    #syswrite KNIFE, "http://$_ 127.0.0.1 root GET\n"
    #print KNIFE "http://$_ 127.0.0.1 root GET\n"
}
close KNIFE;
close FH;


- если исп. print то такое впечатление что вывод серано буфферизируемый, т.к. проходит какоето вреия и сразу список вываливается. Хочу сказать что в этом случаи у меня нет разницы если я исп $|++ или обхажусь без него.
- syswrite работает нормально, как толька поступают байты он сразу в дискриптор

Автор: KSURi 16.4.2008, 12:13
А в чем собственно разница?

Автор: amg 16.4.2008, 12:53
Цитата(BurnerCode @  16.4.2008,  09:56 Найти цитируемый пост)
Хочу понять почему в данном сценарии по разному работаю операторы print с отключенной буфферизацией и syswrite который по дефолту не использует буфферизированый вывод
Дело в том, что $|++ отключает буферизацию не "вообще", а только для умолчаемого канала вывода. Это STDOUT, пока не выбран другой. А KNIFE умолчаемым выбран не был. Поэтому вывод на него через print остается буферизованным.

Решение: заменить строку $|++; на одну из следующих:
Код

# Сделать умолчаем KNIFE и отключить для него буферизацию. 
# После этого можно просто print вместо print KNIFE
select KNIFE; $|++;

# Отключить буферизацию для KNIFE и восстановить статус кво.
# Это работает, т.к. для каждого FH - своя $|
my $oldfh = select KNIFE; $|++; select $oldfh;


Автор: BurnerCode 16.4.2008, 13:16
Блин точн, забыл совсем про select =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)