Это абсолютно ничего не значит ... потому что IO :: Socket :: Unix уже делает это за вас.
Для отправки данных в кусках меньше накладных расходов, поэтому библиотеки файлов накапливают данные для печати в буфере вместо отправки в систему немедленно. Только когда накоплено 4 КБ или 8 КБ (в зависимости от версии) данных, данные фактически отправляются в систему. Это называется «буферизация».
Установка autoflush в true для дескриптора отключает буферизацию для этого дескриптора. Когда вы вызываете print
, данные отправляются в систему до возвращения print
.
Чувствуете разницу:
$ perl -e'
STDOUT->autoflush($ARGV[0]);
for (0..9) { print $_ x 1024; sleep 1; }
' 1
<whole bunch of 1s>
<one second later: whole bunch of 2s>
<one second later: whole bunch of 3s>
<one second later: whole bunch of 4s>
<one second later: whole bunch of 5s>
<one second later: whole bunch of 6s>
<one second later: whole bunch of 7s>
<one second later: whole bunch of 8s>
<one second later: whole bunch of 9s>
$ perl -e'
STDOUT->autoflush($ARGV[0]);
for (0..9) { print $_ x 1024; sleep 1; }
' 0
# Before Perl 5.14:
<four seconds later: whole bunch of 0s, 1s, 2s and 3s>
<four seconds later: whole bunch of 4s, 5s, 6s and 7s>
<two seconds later: whole bunch of 8s and 9s>
# Perl 5.14+
<eight seconds later: whole bunch of 0s, 1s, 2s, 3s, 4s, 5s, 6s and 7s>
<two seconds later: whole bunch of 8s and 9s>
autoflush
включена по IO :: Socket :: * потому, что это необходимо в большинстве случаев для сокетов. Розетки часто используются для интерактивной связи. Запрос, ответ, запрос, ответ и т. Д. Представьте, что произойдет, если запрос застрял в буфере .... Вы будете ждать ответа навсегда!
Очень странно способ написания '$ sock-> AutoFlush (1)', 'STDOUT-> AutoFlush (1)', и т.д. – ikegami