ファイルを読み込んでPerlでデータを解析するコードを最適化しようとしています。Perl:複数のスレッドを使用して複雑なオブジェクトツリーを構築する
背景
- データは、複雑なオブジェクトツリーで終わります。
- トップレベルのオブジェクトは、祝福されたパッケージです。
- ネストされたオブジェクトのいくつかは、別の祝福されたパッケージタイプの呼び出しアイテムとしてnew'edされます。
- 最初のパスでは、バイナリデータをユニット内で区切り、ユニット内で複数の配列にすべて格納されているユニット を区切ります。
- それぞれ8つのセグメントで20または50のユニットが存在する可能性があります。
- 2番目のパスはバイナリデータのデコードを実行し、速度のために最適化が必要なものです。スレッド
- と
アプローチ私は共有::モジュールのスレッドとスレッドを使用しようとしています。
- 私は、各スレッドがユニットのサブセットを処理し、共通のオブジェクトツリーにデータを移入させたいと思います。
私は、スレッドコンテキストから割り当てられ、祝福され、共有オブジェクトツリーに挿入される祝福オブジェクトを共有する方法を示すサンプルコードを探しています。そして、データ検索のためにデータを歩くためにメインスレッドからアクセスできます。デコードが完了すると、デコードスレッドが復帰します。
- スレッド:共有モジュールを使用して複数のスレッドにオブジェクトを共通のオブジェクトツリーに挿入する方法がわかりません。特にItem型のオブジェクトがスレッドコンテキストから祝福されている場合クラス(パッケージ)関数は私が理解しているようにオブジェクトにバインドされません。
- 私は、オブジェクトツリーにオブジェクトを追加する前にコードのthreads :: shared :: lock()関数を使用する必要があることを認識しています。
- 特に、ネストされたblessed Itemオブジェクトは、各スレッドコンテキストから割り当てられます。
- threads :: sharedのドキュメントには、「クラス自体が共有をサポートするように書かれていない限り、オブジェクトを共有することはしばしば賢明ではないことに注意してください。
- これを実現する方法を示すサンプルコードはありますか? は
ドキュメントも「オブジェクトのデストラクタは、各スレッドのスコープ出口のための1つの複数回呼び出されるかもしれません」と言います。どのようにこれは適切に処理されますか?
おかげので、少しバックトラック J.R.
。 "Thread :: Queue"のドキュメントでは、オブジェクトのクラスが共有をサポートしていない場合、オブジェクトをキューに渡すことはできません。 threads :: sharedのバグと制限事項を参照してください。 オブジェクトを含む配列/ハッシュ・リファレンスを渡すと、5.10.0より前のPerlでは機能しないことがあります。私は祝福された物と同じ制限があるように見えます。また、このアプリケーションは残念ながらPerl 5.8.8上にあります。 –
このコメントエディタを使用して改行を行う方法を理解できません。 –
オブジェクトを渡していません。シリアル化されたオブジェクトをスカラーとして渡しています。 – Sobrique