Perl5 Parallel :: ForkManager , вероятно, не будет работать в Perl6 из-за того, как реализован Inline :: Perl5 .
Inline :: Perl5 встраивает компилятор / среду выполнения Perl5 в Perl6.
Parallel :: ForkManager ожидает, что Perl5 был запущен сам по себе.
Если вы когда-нибудь его получилисделайте что-нибудь кроме генерирования ошибки, это вероятно испортило бы время выполнения Perl6.Основной проблемой является использование fork
.Для получения дополнительной информации о том, почему fork
является проблемой, см. Статью, которую Барт Вигманс (brrt) написал об этом: «Будущее для fork (2)»
Perl6 уже имеетаналогичная функция, которую проще использовать.
sub run_parallel (@cmd) {
my @children = do for (@cmd) -> $command {
start {
my $proc = shell $command, :out, :err;
if $proc.exitcode != 0 {
put "$command failed";
put $proc.out.slurp;
put $proc.err.slurp;
die;
}
}
}
await @children;
}
start
- это префикс, который сообщает среде выполнения, чтобы запустить следующий код в ближайшем будущем.Он возвращает Promise .
await
, принимает список Promise s и возвращает список их результатов.
start
в основном вызывает Promise.start
который похож на:
sub start ( &code ) {
my $promise = Promise.new;
my $vow = $promise.vow;
$*SCHEDULER.cue(
{ $vow.keep(code(|c)) },
:catch(-> $ex { $vow.break($ex); }) );
$promise
}
Таким образом, он будет использовать глобально доступный пул потоков в $*SCHEDULER
.Если вы хотите использовать отдельную, вы можете.
sub run_parallel (@cmd) {
my $*SCHEDULER = ThreadPoolScheduler.new(max_threads => 8);
my @children = do for (@cmd) -> $command {
start {
my $proc = shell $command, :out, :err;
if $proc.exitcode != 0 {
put "$command failed";
put $proc.out.slurp;
put $proc.err.slurp;
die;
}
}
}
await @children;
}
Было бы более разумно использовать для этого Proc :: Async .