0

私は子供をフォークするスクリプトに取り組んでいます(一度に1つだけ)。子は DB にクエリを実行し、結果をハッシュ形式で親に返す必要があります。子供から親へのコミュニケーションの最良の方法は何ですか? 現在、次のコードを使用しています。

親:

                  close WRITER;
              chomp(my $line = <READER>);
              logEntry("Parent Pid $$ received panelist listing.");
              print '-------------------------';
              print $line ; 
              print '-------------------------';
              %cached_panelists_hash = %{ decode_json $line };

# READER を閉じます。

子:

    my $json = encode_json \%cached_panelists_hash;
    close READER;
    print WRITER $json;
    close WRITER;  # this will happen anyway

しかし、データが送信されず、親が死ぬため、これは時々失敗します(JSONの形式が正しくありません-形式が不正なデータはありません!)

4

1 に答える 1

2

あなたにとってうまくいくかもしれないし、うまくいかないかもしれないいくつかの解決策のコレクション:

ねじ切り

プロセス間通信は苦痛です。Perl はスレッド化をサポートしています (ただし、スレッド化の実装も面倒です)。変数を共有としてマークできるため、ここで役立つ場合があります。ただし、スレッドは値を返すこともできます。

use threads;

my $query_db_thread = threads->create(\&query_db);

...; # do other stuff at the same time.

my $results = $query_db_thread->join();

sub query_db { ... } # normal sub that returns your data.

Perl スレッド化のセマンティクスはfork にています。つまり、スレッドは同じ変数のように見えるものの別のコピーで動作します (明示的に共有されている場合を除く)。

関数型プログラミングの原則を使用すると、プログラムを簡単にスレッド化できるようになります。

収納可能モジュール

モジュールなどを使用してデータをシリアル化することもできStorableます。ドキュメントには、パッキングとアンパッキングをカバーするいくつかの素晴らしい例があります。要するに:

use Storable qw/freeze thaw/;

# In child:
print PARENT freeze(\%data);

# in parent:
local $/; binmode CHILD;
my $data = thaw(<CHILD>);

JSON はオブジェクトなどのすべての Perl データ構造を送信できないため、Storable は JSON よりも「優れています」。

最も簡単な解決策。

お子様が結果を返すことを望まず、それを親に伝えたい場合は、さまざまな方法でそれを伝えることができます。JSON 以外の値を返すようなものです。親は、maybe-JSON を読み取り、この特別な値をチェックして、JSON をデコードするか (マーカーが見つからない場合)、エラーを処理します。空の文字列は、優れたマーカーになります。

于 2013-03-25T22:42:13.520 に答える