0

我是 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");
...

我也尝试将 $xmlWriter 作为thread::shared变量并lock($xmlWriter)在写入 XML 之前,但面临同样的问题。

感谢您对此的帮助!

4

1 回答 1

7

不知道要开始。

  1. 您获得了 XML::Writer 对象的多个独立副本,它们都构建了同一个 XML 文档。那不适合工作。
  2. 您有多个进程都使用相同的文件句柄。
  3. 共享一个非共享变量以便您可以锁定它绝对没有意义。如果不共享,锁定有什么帮助?

您需要将自己限制为一个 XML::Writer 对象。让所有工作人员将其输出发送回父级,并让父级根据发送的数据创建 XML。

如果您使用Parallel::ForkManager,将按照文档的“数据结构检索”中的示例发回输出。

于 2013-01-03T17:50:04.280 回答