में प्रति-थ्रेड प्रारंभिकरण मैं रेयन के par_iter()
का उपयोग करके अपने फ़ंक्शन को अनुकूलित करने का प्रयास कर रहा हूं।रेयन
एकल थ्रेड संस्करण कुछ इस प्रकार है:
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
पर है, जो वा है वाई बहुत धीमी है। मैं प्रति थ्रेड एक स्टोर उदाहरण का उपयोग करना चाहता हूं।
क्या यह रेयन के साथ संभव है? या मुझे मैन्युअल थ्रेडिंग और वर्क-कतार का सहारा लेना चाहिए?
यह एक शर्म की बात है वहाँ कुछ भी इस कॉल के दायरे वाला होना प्रतीत नहीं होता है (हालांकि यह मामलों के सभ्य उप-समूह में स्पष्ट रूप से उपयोगी है)। –
@ChrisEmerson हां, इस जवाब के बारे में मुझे क्या चिंता है कि मैं सुरक्षित कोड का उपयोग करके बनाए गए स्टोर्स को साफ करने के तरीके (या अन्य सबकुछ के आदेशों को चलाने के तरीके के बारे में सोच नहीं सकता), जैसे कि डिस्क पर उन्हें फ्लश करना)। इससे भी बदतर, 'verify_and_store' के लिए अगली कॉल ** ** ** ** 'स्टोर' क्लोन के साथ काम करना जारी रखेगी, जिनके पास वर्तमान' स्टोर 'के साथ कुछ भी नहीं है। – user4815162342
धन्यवाद। यह काम करता है लेकिन मेरे विशेष मामले में मैंने पाया है कि क्लोन की संख्या को कम करने के लिए रेयन के पास 'par_chunks' है। यद्यपि यह अभी भी प्रति थ्रेड के कई क्लोन में परिणाम हो सकता है, लेकिन इसमें उपयोगकर्ता की समस्या का समाधान नहीं है @ user4815162342 वर्णन कर रहा है। – Tomas