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