gpt4 book ai didi

linux - 如何同时使用 Parallel::ForkManager 和 Capture::Tiny?

转载 作者:太空狗 更新时间:2023-10-29 12:30:49 24 4
gpt4 key购买 nike

下面是我的问题的一个简化示例。这里 exec 应该给出一个错误,因为 xecho 不存在。

问题

有没有办法让 Capture::Tiny 捕获 Parallel::ForkManager 的输出?

#!/usr/bin/perl
use strict;
use warnings;
use Parallel::ForkManager;
use Capture::Tiny 'capture';

my ($stdout, $stderr, $exit) = capture {
my $pm = Parallel::ForkManager->new(5);
my $pid = $pm->start;
if (!$pid) {
no warnings; # no warnings "exec" is not working
exec("xecho test");
$pm->finish;
}
};

print "$stdout\n";
print "$exit\n";
print "$stderr\n";

最佳答案

您不能使用 Capture::Tiny捕获子进程的输出,但您可以使用 Parallel::ForkManager 中的 run_on_finish 方法:

use strict;
use warnings;

use Capture::Tiny qw(capture);
use Data::Dump;
use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(5);
$pm -> run_on_finish (
sub {
my (
$pid, $exit_code, $ident, $exit_signal,
$core_dump, $data_structure_reference
) = @_;

my $info = ${$data_structure_reference};
print "Received from child: \n";
dd $info;
}
);

my $pid = $pm->start;
if (!$pid) {
my ($stdout, $stderr, $exit) = capture {
sleep 4;
exec("xecho");
};
my $info = {stdout => $stdout, stderr => $stderr, exit=> $exit};
$pm->finish(0, \$info);
}

print "Master: waiting for child..\n";
$pm->wait_all_children;

输出:

Master: waiting for child..
Received from child:
{
exit => 0,
stderr => "Can't exec \"xecho\": No such file or directory at ./p.pl line 28.\n",
stdout => "",
}

关于linux - 如何同时使用 Parallel::ForkManager 和 Capture::Tiny?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27678493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com