首页 > 解决方案 > Perl6:无法调用此对象(REPR:P6opaque;Parallel::ForkManager)

问题描述

我正在尝试使用 Perl5 在 Perl6 中并行运行一系列 shell 命令,Parallel::ForkManager 这是对工作 Perl5 代码的几乎精确的翻译。

CONTROL {
    when CX::Warn {
        note $_;
        exit 1;
    }
}
use fatal;
role KeyRequired {
    method AT-KEY (\key) {
        die "Key {key} not found" unless self.EXISTS-KEY(key);
        nextsame;
    }
}

use Parallel::ForkManager:from<Perl5>;

sub run_parallel (@cmd) {
    my $manager = Parallel::ForkManager(8).new();
    for (@cmd) -> $command  {
        $manager.start and $manager.next;
        my $proc = shell $command, :out, :err;
        if $proc.exitcode != 0 {
            put "$command failed";
            put $proc.out.slurp;
            put $proc.err.slurp;
            die;
        }
        $manager.finish;
    }
    $manager.wait_all_children;#necessary after all lists
}

my @cmd;
my Str $dir = 'A/1';
for dir($dir, test => /\.vcf\.gz$/) -> $vcf {
    @cmd.append: "aws s3 cp $vcf s3://s3dir/$dir/"
}
put @cmd.elems;
run_parallel(@cmd);

基本上,我正在尝试并行化乏味的 shell 命令。

然而,这个神秘的错误出现了:

无法在 2.aws_cp.p6 第 18 行的子 run_parallel 中调用此对象 (REPR: P6opaque; Parallel::ForkManager) 在 2.aws_cp.p6 第 39 行的块中

为什么 Perl6 会这样说?怎么了?我怎样才能让这些命令运行?

也许有一种更本机/惯用的方式在 Perl6 中并行运行 shell 命令?

标签: raku

解决方案


您可能想看看使用Proc::Async在线程中异步运行外部命令,而无需派生单独的代码实例来执行此操作。


推荐阅读