使用XML :: Writer编写XML的线程问题

时间:2013-01-03 17:35:42

标签: multithreading perl

我是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),但面临同样的问题。

感谢你的帮助!

1 个答案:

答案 0 :(得分:7)

不知道是不是要开始。

  1. 您有多个XML :: Writer对象的独立副本,它们都构建相同的XML文档。这不是工作的原因。
  2. 您使用相同的文件句柄获得了多个进程。
  3. 分享一个非共享变量以便锁定它绝对没有意义。如果没有共享,锁定如何帮助?
  4. 您需要将自己限制为一个XML :: Writer对象。让所有工作人员将其输出发送回父级,并让父级从发送的数据中创建XML。

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