В том то и вопрос, что если в процессе потомке что-то делать, то распаралеливание процессов не получается. Например если в ветку else засунуть
Код: Выделить всё
my $i = 0;
for ($i; $i<=10 ; $i++) {
Time::HiRes::sleep(1.0);
}
то весь скрипт выполняется в пять раз дольше!!!
Вообщем есть следующий скрипт:
Код: Выделить всё
use strict;
use IO::Handle;
use Benchmark;
my $tmStamp1 = new Benchmark;
#/////////////////////////////////////////////////////////////////////////////////
my $threads = 5;
my @pids;
my $isExit = 0;
#/////////////////////////////////////////////////////////////////////////////////
print "$isExit\n";
print "start\n";
for (my $i = 1; $i <= ($threads); $i++) {
pipe(PARENT_RD, CHILD_WR);
autoflush CHILD_WR;
my $pid;
if ($pid = fork) {
close CHILD_WR;
chomp($isExit = <PARENT_RD>);
close PARENT_RD;
push(@pids,$pid);
}
else {
die "cannot fork: $!" unless defined $pid;
my $i = 0;
for ($i; $i<=5; $i++) {
Time::HiRes::sleep(1.0);
}
close PARENT_RD;
print CHILD_WR "1";
close CHILD_WR;
exit;
}
}
for (my $l = 0; $l <= ($threads-1); $l++) {
print "$pids[$l]\n";
waitpid($pids[$l], 0);
}
print "stop\n";
print "$isExit\n";
#/////////////////////////////////////////////////////////////////////////////////
my $tmStamp2 = new Benchmark;
my $tmDiffer = timediff($tmStamp1, $tmStamp2);
print timestr($tmDiffer);
Так вот при $threads = 1 он выполняется 6 секунд, а при = 5, скрипт работает все 30 секунд.
Получается, что процессы-потомки работают последовательно.
Если убрать всё, что связанно с pipe при любом значении $threads ( вплоть до 50)
скрипт выполняется за теже 6 секунд.
Вот в чём собака порылась!
В том то и вопрос, что если в процессе потомке что-то делать, то распаралеливание процессов не получается. Например если в ветку else засунуть
[code]
my $i = 0;
for ($i; $i<=10 ; $i++) {
Time::HiRes::sleep(1.0);
}
[/code]
то весь скрипт выполняется в пять раз дольше!!!
Вообщем есть следующий скрипт:
[code]
use strict;
use IO::Handle;
use Benchmark;
my $tmStamp1 = new Benchmark;
#/////////////////////////////////////////////////////////////////////////////////
my $threads = 5;
my @pids;
my $isExit = 0;
#/////////////////////////////////////////////////////////////////////////////////
print "$isExit\n";
print "start\n";
for (my $i = 1; $i <= ($threads); $i++) {
pipe(PARENT_RD, CHILD_WR);
autoflush CHILD_WR;
my $pid;
if ($pid = fork) {
close CHILD_WR;
chomp($isExit = <PARENT_RD>);
close PARENT_RD;
push(@pids,$pid);
}
else {
die "cannot fork: $!" unless defined $pid;
my $i = 0;
for ($i; $i<=5; $i++) {
Time::HiRes::sleep(1.0);
}
close PARENT_RD;
print CHILD_WR "1";
close CHILD_WR;
exit;
}
}
for (my $l = 0; $l <= ($threads-1); $l++) {
print "$pids[$l]\n";
waitpid($pids[$l], 0);
}
print "stop\n";
print "$isExit\n";
#/////////////////////////////////////////////////////////////////////////////////
my $tmStamp2 = new Benchmark;
my $tmDiffer = timediff($tmStamp1, $tmStamp2);
print timestr($tmDiffer);
[/code]
Так вот при $threads = 1 он выполняется 6 секунд, а при = 5, скрипт работает все 30 секунд.
Получается, что процессы-потомки работают последовательно.
Если убрать всё, что связанно с pipe при любом значении $threads ( вплоть до 50)
скрипт выполняется за теже 6 секунд.
Вот в чём собака порылась!