Perlの可変スレッド数でファイルデータを共有するための信頼性のある方法を探しています。私は、メインスレッドがファイルから行を読み込み、他のワーカースレッドが個々のエントリを処理するような設定をしたいと考えています。Perlのスレッド間でファイルデータを共有するための巧妙な方法
これまでのところ、私はThread :: Queueを使用しようとしましたが、それらには多大な幸運はありませんでした。ファイルの最後に到達すると、スレッドの大部分は、メインスレッドが読み込みを終了してからデータを読み込むのを待っているブロック状態になってしまいます。スレッドはリムーバでやや張り付いていて、join()はそれらを巻き戻すことができません。
キューに対して非ブロックアクセスを使用すると、スレッドは "データを取得しようとすると、その定義されていない、データを取得しようとする... "これは、CPUを壊すと仕事をして終了します。各スレッドは、通常、1つのワーカースレッドしかない場合でも、タイトループの少なくとも数回の反復を取得します。 sleep()は整数値しか取らないので(sleep(0)は役に立たずsleep(1)は遅すぎる)ので、sleep()の投げ込みはあまり役に立ちません。
最適なのは、入力ファイルのストリームを共有し、各スレッドにロックをかけ、そこから行を読み込んだり、ロックを解除したりすることができますが、グロブの共有は禁止されています。私は最初にファイル全体をメモリにロードしますが、ローエンドの推定値として4000万エントリがあるので、それは非常に実現可能ではありません。
これはどこに来ているのですか?私はデータを待っている過度のCPUを浪費しないメインスレッドとワーカースレッドの間でリーダー/プロセッサーの設定を実装し、読み手がファイルの終わりに達すると()対応可能な状態になります。
ありがとうございました!その後、
短時間の遅延や、(shudder) 'select undef、undef、undef、$ short_delay'でも' Time :: HiRes :: sleep'を使用してください。 – mob