我想使用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
上每迭代,這是WA太慢了。我想每個線程使用一個商店實例。
人造絲這可能嗎?還是應該採取手動線程和工作隊列?
豈不可惜那裏似乎不是是什麼範圍限定在這個調用(雖然這對於一個體面的案例子集顯然是有用的)。 –
@ChrisEmerson是的,我對這個答案感到擔憂的是,我無法想象使用安全代碼來清理創建的存儲(或者在一切完成時運行其他任意命令,比如將其刷新到磁盤)的方法。更糟糕的是,下一次調用'verify_and_store'將繼續使用** last **已知的'Store'克隆,這可能與當前的'store'無關。 – user4815162342
謝謝。這可行,但在我個人的情況下,我發現人造絲有'par_chunks'來減少克隆的數量。雖然這可能仍然會導致每個線程有多個克隆,但它沒有@ user4815162342描述的範圍問題。 – Tomas