私は perl でマルチスレッド アプリケーションを使用しており、スレッド セーフではないいくつかのモジュールに依存する必要があるため、メッセージ パッシング インターフェイスとしてシグナルを使用してfork()
ed プロセスを使用しています。kill()
問題は、シグナル ハンドラーが少し不安定で (控えめに言っても)、不適切な状態でプロセスが強制終了されることがよくあることです。
これを行うより良い方法はありますか?
私は perl でマルチスレッド アプリケーションを使用しており、スレッド セーフではないいくつかのモジュールに依存する必要があるため、メッセージ パッシング インターフェイスとしてシグナルを使用してfork()
ed プロセスを使用しています。kill()
問題は、シグナル ハンドラーが少し不安定で (控えめに言っても)、不適切な状態でプロセスが強制終了されることがよくあることです。
これを行うより良い方法はありますか?
プログラムが何をする必要があるかによっては、ユーザー空間スレッドを使用するマルチスレッド アプリケーション用の Perl フレームワークであるPOEの使用を検討することもできます。これは複雑ですが、エレガントで強力であり、アクティビティを単一の Perl インタープリター スレッドに限定することで、非スレッド セーフ モジュールを回避するのに役立ちます。
始めるのに役立つリソース:
さらに、アプリケーションへのアセンブルに使用できる数百のビルド済みPOE コンポーネントがあります。
メッセージをやり取りするために、いつでも親と子の間でパイプを使用できます。
pipe my $reader, my $writer;
my $pid = fork();
if ( $pid == 0 ) {
close $reader;
...
}
else {
close $writer;
my $msg_from_child = <$reader>;
....
}
あまり快適なプログラミング方法ではありませんが、「不安定」であってはなりません。
forks.pmを見てください。これは、「fork() を使用した Perl スレッドのドロップイン置換」であり、より賢明なメモリ使用を実現します (ただし、Win32 では使用しないでください)。これにより、「共有」変数を宣言できるようになり、プロセス間でそのような変数に加えられた変更が自動的に渡されます (threads.pm の処理方法と同様)。
perl 5.8 以降では、コア スレッド モジュールを確認する必要があります。http://metacpan.org/pod/threadsをご覧ください
スレッド セーフではないモジュールを使用する場合は、通常、スレッド エントリ ポイント内で require および import を使用してそれらをロードできます。