在Perl中分叉多个子节点并使用管道进行双向通信

在Perl中分叉多个子节点并使用管道进行双向通信,第1张

概述我正在尝试创建一个具有多处理功能的小型Perl程序.由于我的要求中存在一些小的变化,我无法在任何地方找到任何类似的示例脚本. 我需要从STDIN读取一个大的日志文件,并将第一个N号码(一个大号码)再次给第一个子进程,然后将第二个N行给第二个子进程等.我还有一个常量定义的是允许并发运行的最大子进程数.一旦达到最大子女数,父母将等待孩子完成其工作,并给予另外N行. 父进程还会收集每个子进程在完成时返回 我正在尝试创建一个具有多处理功能的小型Perl程序.由于我的要求中存在一些小的变化,我无法在任何地方找到任何类似的示例脚本.

我需要从STDIN读取一个大的日志文件,并将第一个N号码(一个大号码)再次给第一个子进程,然后将第二个N行给第二个子进程等.我还有一个常量定义的是允许并发运行的最大子进程数.一旦达到最大子女数,父母将等待孩子完成其工作,并给予另外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 jobswhile (@loglines > 0) {    $pID = fork {        args => [ splice @loglines,$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 resultswhile ($pID = waitpID -1,0) {    last if $pID == -1;    my @results_from_job = $pID->read_stdout();    push @results,@results_from_job;}
总结

以上是内存溢出为你收集整理的在Perl中分叉多个子节点并使用管道进行双向通信全部内容,希望文章能够帮你解决在Perl中分叉多个子节点并使用管道进行双向通信所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1239312.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存