Конечно, вы можете буферизовать в родительском процессе и записывать в него только тогда, когда дочерний файл доступен для записи (т.е. запись не блокируется). Вы можете сделать это самостоятельно с правильными аргументами для syswrite или использовать цикл обработки событий:
use AnyEvent;
use AnyEvent::Handle;
# make child, assume you write to it via $fh
my $done = AnyEvent->condvar;
my $h = AnyEvent::Handle->new( fh => $fh );
while( you do stuff ){
my $data = ...;
$h->push_write($data); # this will never block
}
$h->on_drain(sub { $done->send });
$done->wait; # now you block, waiting for all writes to actually complete
Редактировать: Раньше это было непроверенным, но я проверил, и это работает. (Я использовал perl -ne "sleep 1; print $_"
в качестве медленного потомка.) Запись продолжается во время цикла while, если это возможно, но никогда не блокирует цикл. В конце вы фактически блокируете, пока все записи не будут завершены.
Мои тестовые сценарии на gist.github: http://gist.github.com/126488
Вы можете видеть, как дочерний элемент блокирует цикл блокировки, но как он не блокирует неблокирующий цикл. Очевидно, когда ты так говоришь;)
(Наконец, как общее практическое правило; если вы взаимодействуете с сетью или другими процессами, вам, вероятно, следует использовать цикл обработки событий.)