my $collect;
while(($collect = waitpid(-1, WNOHANG)) > 0) {
$kid_proc_num--;
}
}
if($kid_proc_num==0) { last; }
else { next; }
}
以上的代码采用多进程方式同时处理了对 3 个测试设备的配置操作,然后主进程等待所有配置操作完成,再进行后续的测试。
另外一种情况较为复杂,就是经常需要针对数百个主机和存储进行配置、状态查询等,而且配置结果和查询状态需要返回主进程处理,然后根据结果数据再决定如何继续。对于这种情况,主进程需要生成数百个子进程,而且每个子进程都有大量的信息返回给主进程来处理。这样处理数百个子进程的生成:由于多进程方式占用系统资源较多,因此设定一个允许主进程同时运行的最多子进程数目,然后在有子进程结束时,主进程再生成新的子进程至所有的子任务完成。这样处理主进程和子进程的通信和信息交互:由于测试 Perl 脚本运行平台为 Linux,它是带有 BSD 风格的 POSIX 兼容的系统,会提供可靠的信号,所以仍然使用系统提供信号的来获取子进程结束的消息;对于子进程的返回信息,采用为每个子进程产生一个临时文件用于存储返回的所有信息,最后主进程来处理这些文件从而获取每个子任务的结果信息。如下是为这种情况设计的多进程处理方式的软件流图。
图 3. 软件流图
下面以登录每个主机检查运行状态的例子给出多进程处理数百个子任务的代码。
清单 2. 多进程处理数百个子任务
文章来源于领测软件测试网 https://www.ltesting.net/