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

Jay*_*Jay 0 perl multithreading

我是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");
...
Run Code Online (Sandbox Code Playgroud)

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

感谢您对此的帮助!

ike*_*ami 7

不知道是不是要开始.

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

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

如果使用Parallel :: ForkManager,则按照文档的"数据结构检索"中的示例发送回输出.