在Perl中分叉多个子节点并使用管道进行双向通信
发布时间:2020-12-16 06:16:48 所属栏目:大数据 来源:网络整理
导读:我正在尝试创建一个具有多处理功能的小型Perl程序.由于我的要求中存在一些小的变化,我无法在任何地方找到任何类似的示例脚本. 我需要从STDIN读取一个大的日志文件,并将第一个N号码(一个大号码)再次给第一个子进程,然后将第二个N行给第二个子进程等.我还有一
我正在尝试创建一个具有多处理功能的小型Perl程序.由于我的要求中存在一些小的变化,我无法在任何地方找到任何类似的示例脚本.
我需要从STDIN读取一个大的日志文件,并将第一个N号码(一个大号码)再次给第一个子进程,然后将第二个N行给第二个子进程等.我还有一个常量定义的是允许并发运行的最大子进程数.一旦达到最大子女数,父母将等待孩子完成其工作,并给予另外N行. 父进程还会收集每个子进程在完成时返回的多行(5-10行)输出,并将其存储在数组中.然后,Parent继续处理此数组内容并最终显示结果. 有没有更好的示例脚本我可以修改和使用,或者有人可以通过在这里共享一个帮助我?我更喜欢仅使用管道进行流程互通,并尽可能简化事务. 编辑: 解决方法
使用
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,$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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |