3

私は perl でマルチスレッド アプリケーションを使用しており、スレッド セーフではないいくつかのモジュールに依存する必要があるため、メッセージ パッシング インターフェイスとしてシグナルを使用してfork()ed プロセスを使用しています。kill()

問題は、シグナル ハンドラーが少し不安定で (控えめに言っても)、不適切な状態でプロセスが強制終了されることがよくあることです。

これを行うより良い方法はありますか?

4

4 に答える 4

7

プログラムが何をする必要があるかによっては、ユーザー空間スレッドを使用するマルチスレッド アプリケーション用の Perl フレームワークであるPOEの使用を検討することもできます。これは複雑ですが、エレガントで強力であり、アクティビティを単一の Perl インタープリター スレッドに限定することで、非スレッド セーフ モジュールを回避するのに役立ちます。

始めるのに役立つリソース:

さらに、アプリケーションへのアセンブルに使用できる数百のビルド済みPOE コンポーネントがあります。

于 2008-09-26T14:29:00.717 に答える
6

メッセージをやり取りするために、いつでも親と子の間でパイプを使用できます。

pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
    close $reader;
    ...
}
else {
    close $writer;
    my $msg_from_child = <$reader>;
    ....
}

あまり快適なプログラミング方法ではありませんが、「不安定」であってはなりません。

于 2008-09-26T11:11:23.607 に答える
4

forks.pmを見てください。これは、「fork() を使用した Perl スレッドのドロップイン置換」であり、より賢明なメモリ使用を実現します (ただし、Win32 では使用しないでください)。これにより、「共有」変数を宣言できるようになり、プロセス間でそのような変数に加えられた変更が自動的に渡されます (threads.pm の処理方法と同様)。

于 2008-09-26T14:58:26.997 に答える
1

perl 5.8 以降では、コア スレッド モジュールを確認する必要があります。http://metacpan.org/pod/threadsをご覧ください

スレッド セーフではないモジュールを使用する場合は、通常、スレッド エントリ ポイント内で require および import を使用してそれらをロードできます。

于 2008-09-26T11:04:10.283 に答える