Rayonのpar_iter()
を使用して機能を最適化しようとしています。Rayonのスレッドごとの初期化
シングルスレッド版のようなものです:
fn verify_and_store(store: &mut Store, txs: Vec<Tx>) {
let result = txs.iter().map(|tx| {
tx.verify_and_store(store)
}).collect();
...
}
各Store
インスタンスは一つのスレッドでのみ使用されなければならないが、Store
の複数のインスタンスを同時に使用することができますので、私は、これはclone
-ingにより、マルチスレッド化することができますstore
:
fn verify_and_store(store: &mut Store, txs: Vec<Tx>) {
let result = txs.par_iter().map(|tx| {
let mut local_store = store.clone();
tx.verify_and_store(&mut local_store)
}).collect();
...
}
しかし、これはワシントン州でstore
すべてのの反復をクローンyが遅すぎる。スレッドごとに1つのストアインスタンスを使用したいと思います。
これはRayonでも可能ですか?または私は手動のスレッドと作業キューに頼るべきですか?
それはしかし(この呼び出しにスコープものがあるようには思えない残念ですこれは明らかに適切なケースのサブセットで有用です)。 –
@ChrisEmersonはい、この回答について私が心配しているのは、安全なコードを使用して、作成した店舗を清掃する方法(またはディスクにフラッシュするなど、すべてが完了したら他の任意のコマンドを実行する方法)を考えることができないということです。さらに悪いことに、 'verify_and_store'の次回の呼び出しは** last **の既知の' Store'クローンで動作し続けます。おそらく現在の 'store'とは関係ありません。 – user4815162342
ありがとうございます。これはうまくいきますが、私の場合、私はRayonがクローンの数を減らすために 'par_chunks'を持っていることを発見しました。これは依然としてスレッドごとに複数のクローンが発生する可能性がありますが、@ user4815162342が説明している範囲の問題はありません。 – Tomas