使用以下命令代替线程和 ``:
open my $fh, '-|', 'some_program --with-options';
以这种方式打开多个文件句柄(与您需要运行的程序一样多),然后使用IO::Select http://search.cpan.org/perldoc?IO::Select从他们那里轮询数据。
简单的例子。
假设我有如下所示的 shell 脚本:
=> cat test.sh
#!/bin/bash
for i in $( seq 1 5 )
do
sleep 1
echo "from $$ : $( date )"
done
它的输出可能如下所示:
=> ./test.sh
from 26513 : Fri Aug 7 08:48:06 CEST 2009
from 26513 : Fri Aug 7 08:48:07 CEST 2009
from 26513 : Fri Aug 7 08:48:08 CEST 2009
from 26513 : Fri Aug 7 08:48:09 CEST 2009
from 26513 : Fri Aug 7 08:48:10 CEST 2009
现在,我们来写一个multi-test.pl
:
#!/usr/bin/perl -w
use strict;
use IO::Select;
my $s = IO::Select->new();
for (1..2) {
open my $fh, '-|', './test.sh';
$s->add($fh);
}
while (my @readers = $s->can_read()) {
for my $fh (@readers) {
if (eof $fh) {
$s->remove($fh);
next;
}
my $l = <$fh>;
print $l;
}
}
正如你所看到的,没有叉子,没有线程。这就是它的工作原理:
=> time ./multi-test.pl
from 28596 : Fri Aug 7 09:05:54 CEST 2009
from 28599 : Fri Aug 7 09:05:54 CEST 2009
from 28596 : Fri Aug 7 09:05:55 CEST 2009
from 28599 : Fri Aug 7 09:05:55 CEST 2009
from 28596 : Fri Aug 7 09:05:56 CEST 2009
from 28599 : Fri Aug 7 09:05:56 CEST 2009
from 28596 : Fri Aug 7 09:05:57 CEST 2009
from 28599 : Fri Aug 7 09:05:57 CEST 2009
from 28596 : Fri Aug 7 09:05:58 CEST 2009
from 28599 : Fri Aug 7 09:05:58 CEST 2009
real 0m5.128s
user 0m0.060s
sys 0m0.076s