Perlでプロセスを管理する方法はありますか(実際に機能するスレッドの置き換え)?

StackOverflow https://stackoverflow.com/questions/138696

質問

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

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

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

役に立ちましたか?

解決

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

他のヒント

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

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

さらに、何百ものビルド済み 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を使用してそれらをロードできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top