我是Perl的新手,并尝试使用XML :: Writer将并行进程的输出写入XML文件,并看到生成的XML中缺少某些进程输出。
请帮助我让$ xmlWriter是线程安全的,这样在写输出时不会有任何问题。
我正在使用ForkManager来生成并行处理
my $xmlWriter = XML::Writer->new( OUTPUT => output.xml )
...
$pm = new ForkManager(50);
$xmlWriter->startTag("report");
foreach $cmd(@cmdList) {
$pid = $pm->start($cmd) and next;
timeout 300 => sub {
$status= system($cmd);
....
$xmlWriter->startTag("task","command"=>"$cmd");
$xmlWriter->startTag("status");
$xmlWriter->characters("$status");
$xmlWriter->endTag("status");
$xmlWriter->endTag("task");
}
}
$xmlWriter->endTag("report");
...
在写入XML之前,我还尝试将$ xmlWriter设为thread::shared
变量和lock($xmlWriter)
,但面临同样的问题。
感谢你的帮助!
答案 0 :(得分:7)
不知道是不是要开始。
您需要将自己限制为一个XML :: Writer对象。让所有工作人员将其输出发送回父级,并让父级从发送的数据中创建XML。
如果您使用Parallel::ForkManager,则会根据文档“数据结构检索”中的示例发送回输出。