Omi*_*mid 3 perl ipc interprocess
最近,当我想在两个进程之间进行通信时,我遇到了使用(pipe | - )的问题.基本上,子进程无法像父进程一样快地处理STDIN.这导致父级等待STDIN空闲并使其运行缓慢.
STDIN有多大,可以修改它.如果是,最佳练习大小是多少?
这是一些代码示例,以显示我的意思:
if ($child_pid = open($child, "|-"))
{
$child->autoflush(1);
# PARENT process
while (1)
{
# Read packet from socket save in $packet
process_packet($packet);
# forward packet to child
print $child $packet;
}
}
else
{
die "Cannot fork: $!" unless defined $child_pid;
# CHILD process
my $line;
while($line = <STDIN>)
{
chomp $line;
another_process_packet($line);
}
}
Run Code Online (Sandbox Code Playgroud)
在这个样本another_process_packet慢于process_packet.我写这样的代码的原因是,我想使用相同的数据来自套接字并实际获得它一次.
提前致谢.
您当然可以在父进程中进行缓冲,并且只在子进程的fd可写时才写入子进程(即写入不会阻塞).您可以使用正确的参数进行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
Run Code Online (Sandbox Code Playgroud)
编辑:这曾经是未经测试的,但我测试了它,它的工作原理.(我用作perl -ne "sleep 1; print $_"慢孩子.)如果可能的话,写入在while循环期间继续,但永远不会阻止循环.最后,您实际上会阻塞,直到所有写入完成.
我的测试脚本在gist.github上:http://gist.github.com/126488
您可以看到子如何阻止阻塞循环,但它如何阻止非阻塞循环.当你这样说时明显;)
(最后,作为一般经验法则;如果您正在与网络或其他进程交互,您应该使用事件循环.)