【发布时间】:2015-04-20 06:02:46
【问题描述】:
在修改 pid 条件时,我对 Parallel::ForkManager 有两个问题。
问题1:举个简单的例子,
use strict;
use warnings;
use Parallel::ForkManager;
use IO::Socket ;
my $np = 32 ;
my $pm = Parallel::ForkManager->new($np);
$| = 1 ;
sub do_something{ #an example for 3 second delay
my $port = shift @_ ;
my $tgt = 192.168.0.1 ;
my $sock = IO::Socket::INET->new(PeerAddr=>"$tgt:$port",Proto='tcp',Timeout=>3) ;
$sock ? return $sock : return 0 ;
}
foreach (1..64) {
$pm->start and next ;
do_something($_) ;
$pm->finish ;
}
$pm->wait_all_children ;
上面的脚本工作,与
time perl simple_script.pl
real 0m7.109s
user 0m0.237s
sys 0m0.080s
同时修改
$pm->start and next ;
do_something($_) ;
到
$pm->start and next or do_something($_) ;
或
!($pm->start) or do_something($_) ;
似乎也可以工作,但不如预期的那样。
time perl modified_script.pl
real 3m12.307s
user 0m0.237s
sys 0m0.080s
似乎其他两个修改版本一次运行一个进程。
问题2:
有没有其他方法可以在不使用 foreach 循环中的 next 的情况下做同样的事情?这样脚本就可以适应 map 而不是 foreach 循环。
P.S:分叉和对象创建不是我的强项。
编辑:根据建议删除 &。
【问题讨论】:
-
最大的问题是为什么要使用
map,它旨在通过对输入列表的每个元素应用相同的函数来将一个列表转换为另一个列表。顺便说一句,在调用 Perl 函数时不要使用 & 符号&:从大约 20 年前的 Perl 4 开始就没有必要了
标签: perl dictionary fork