В каких ситуациях можно предпочесть небуферизованный вывод? - PullRequest
2 голосов
/ 03 июля 2011

К обсуждению в моем предыдущем вопросе я узнал, что Perl по умолчанию выдает линейный буфер.

$| = 0; # for buffered output (by default)

Если вы хотите получить небуферизованный вывод, тогда установите специальную переменную $| равной 1, т.е.

$| = 1;  # for unbuffered output

Теперь я хочу знать, что могут быть возможные ситуации, когда следует предпочесть небуферизованный вывод?

Ответы [ 3 ]

9 голосов
/ 03 июля 2011

Вы хотите небуферизованный вывод для интерактивных задач. Под этим я подразумеваю, что вы не хотите, чтобы вывод застрял в каком-то буфере, когда вы ожидаете, что кто-то или что-то еще ответит на вывод.

Например, вы не хотите, чтобы пользовательские приглашения, отправленные в STDOUT, были буферизованы. (Вот почему STDOUT никогда полностью не буферизуется при подключении к терминалу. Он буферизуется только строкой, а буфер очищается при попытках чтения из STDIN.)

Например, вы бы хотели, чтобы запросы, отправленные по каналам и сокетам, не застревали в каком-либо буфере, так как другой конец соединения никогда бы его не увидел.


Единственная другая причина, о которой я могу думать, это когда вы не хотите, чтобы важные данные помещались в буфер в случае неисправимой ошибки, такой как паника или смерть по сигналу.

Например, вы можете оставить файл журнала без буферизации, чтобы иметь возможность диагностировать серьезные проблемы. (Вот почему STDERR не буферизируется по умолчанию.)

8 голосов
/ 03 июля 2011

Вот небольшая выборка пользователей Perl из StackOverflow, которые извлекли пользу из обучения установке $| = 1:

STDOUT перенаправлен извне, и на консоли не видно выхода

Функция Perl Print не работает должным образом при использовании Sleep ()

невозможно записать в файл, используя печать

Проблемы с добавлением perl

Неясное выполнение сценария Perl

Perl: запуск "Демона" и печать

Перенаправление STDOUT трубы в Perl

Почему мой родительский процесс не видит вывод дочернего процесса, пока он не завершится?

Почему добавление или удаление новой строки изменяет способ, которым этот perl используется для функций цикла?

Perl не печатается должным образом

Как в Perl обрабатывать ввод, как только он поступает, вместо ожидания новой строки?

Какой простой способ сохранить выходной поток в точности так, как он показан на экране (при использовании интерактивных данных)?

Можно ли печатать из Perl CGI до завершения процесса?

Почему не выводится вывод ничего на каждой итерации цикла, когда я использую sleep?

Демон Perl не работает со сном ()

3 голосов
/ 03 июля 2011

Может быть полезно при записи в другую программу через сокет или канал. Это также может быть полезно при записи отладочной информации в STDOUT для наблюдения за состоянием вашей программы в прямом эфире.

...