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

また、XMLに書き込む前に、$ xmlWriterをthread::shared変数として作成しようとしlock($xmlWriter)ましたが、同じ問題に直面しています。

これについてあなたの助けに感謝します!

4

1 に答える 1

7

始めるべきかわからない。

  1. XML :: Writerオブジェクトの複数の独立したコピーを取得し、すべて同じXMLドキュメントを作成しました。それはうまくいきません。
  2. すべて同じファイルハンドルを使用する複数のプロセスを取得しました。
  3. 非共有変数を共有してロックできるようにすることは、まったく意味がありません。共有されていない場合、ロックはどのように役立ちますか?

1つのXML::Writerオブジェクトに制限する必要があります。すべてのワーカーに出力を親に返送させ、送信されたデータから親にXMLを作成させます。

Parallel :: ForkManagerを使用する場合、出力の返送は、ドキュメントの「データ構造の取得」の例のように行われます。

于 2013-01-03T17:50:04.280 に答える