gpt4 book ai didi

perl - 在 Perl 中 fork 多个子节点并使用管道进行双向通信

转载 作者:行者123 更新时间:2023-12-01 01:22:54 26 4
gpt4 key购买 nike

我正在尝试创建一个具有多处理能力的小型 Perl 程序。由于我的要求中到处都有一些小的更改,因此我无法在任何地方找到任何类似的示例脚本。

我需要从 STDIN 读取一个大的日志文件,并给第一个子进程的前 N ​​行(又是一个大的数字),然后给第二个子进程等接下来的 N 行。我还定义了一个常量,它是允许同时运行的最大子进程数。一旦达到 child 的最大数量, parent 将等待 child 完成其工作并给它另外 N 行。

父进程还收集每个子进程完成时返回的多行(5-10 行)输出并将其存储在数组中。 Parent 然后继续处理这个数组内容并最终显示结果。

是否有更好的示例脚本可以修改和使用,或者有人可以通过在这里分享一个来帮助我吗?我更喜欢只使用管道进行进程互通,并尽可能让事情变得更简单。

编辑:
有人可以举例说明如何仅使用 IO::Handle 模块中的管道来完成此操作吗?

最佳答案

使用 Forks::Super ,这使得限制同时进程的数量和处理进程间通信变得容易。例如,

use Forks::Super MAX_PROC => 10,     # allow 10 simultaneous processes
ON_BUSY => 'queue'; # don't block when >=10 jobs are active

@loglines = <>;

# set up all the background jobs
while (@loglines > 0) {
$pid = fork {
args => [ splice @loglines, 0, $N ], # to pass to sub, below
child_fh => "out", # make child STDOUT readable by parent
sub => sub {
my @loglines = @_;
my @result = ... do something with loglines ...
print @results; # use $pid->read_stdout() to read in child
}
};
}

# get the results
while ($pid = waitpid -1, 0) {
last if $pid == -1;
my @results_from_job = $pid->read_stdout();
push @results, @results_from_job;
}

关于perl - 在 Perl 中 fork 多个子节点并使用管道进行双向通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8423072/

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