मुझे पता है कि जंग हल्के धागे के साथ लूप चला सकता है। कुछ ऐसा:लूप के लिए डी में मल्टीथ्रेडिंग
use task::spawn;
fn main() {
for 100.times {
do spawn {
io::println("Hello");
}
}
मैं डी में यह कैसे कर सकता हूं?
मुझे पता है कि जंग हल्के धागे के साथ लूप चला सकता है। कुछ ऐसा:लूप के लिए डी में मल्टीथ्रेडिंग
use task::spawn;
fn main() {
for 100.times {
do spawn {
io::println("Hello");
}
}
मैं डी में यह कैसे कर सकता हूं?
प्रासंगिक एपीआई दस्तावेज़: एक TaskPool के parallel का उपयोग कर,
समानांतर foreach: std.parallelism
यहाँ अपने उदाहरण को पूरा करने के तौर-तरीकों में से कुछ हैं
foreach (i, val; taskPool.parallel(new int[50])) {
writeln("Hello:", i);
}
नियमित foreach बताया put का उपयोग करके कार्य पूल में कार्य:
foreach (i; 0 .. 50) {
auto t = task!writeln("Hello:", i);
taskPool.put(t);
}
एक TaskPool के बजाय एक new thread में प्रत्येक कार्य निष्पादित करें:
foreach (i; 0 .. 50) {
auto t = task!writeln("Hello:", i);
t.executeInNewThread();
}
जंग के क्रम में एक अंतर्निहित कार्य अनुसूचक है, लेकिन डी के साथ, यह किसी लाइब्रेरी के रूप में कार्यान्वित किया जाता है। कहा जा रहा है कि दूसरा कार्यक्षमता के मामले में निकटतम है, और आखिरी वाक्य वाक्यविन्यास के मामले में निकटतम है (लेकिन वे ओएस धागे हैं, हल्के वजन नहीं)।
डी में, हल्के धागे को प्रोग्रामर द्वारा स्पष्ट रूप से नियंत्रित किया जाता है। एक TaskPool
जंग/गो में शेड्यूलर के समान है, लेकिन यह प्रोग्रामर को अधिक बढ़िया नियंत्रण देता है। यह थोड़ा और वर्बोज़ बनाता है, लेकिन यह आपको map
, reduce
, foreach
इत्यादि के समानांतर संस्करण भी प्रदान करता है। इससे अधिक जटिल एल्गोरिदम का प्रभावी ढंग से प्रतिनिधित्व करना आसान हो जाता है।
प्रत्येक उदाहरण को चलाने से आपको अपेक्षित परिणाम मिलना चाहिए: ऑर्डर लिखने से बाहर।
नोट:
डॉक से:
इस पूल में कार्यकर्ता सूत्र, डेमॉन धागे हैं जिसका अर्थ है कि यह आवश्यक समाप्त होने से पहले TaskPool.stop या TaskPool.finish कॉल करने के लिए नहीं है मुख्य धागा
दूसरा उदाहरण तब तक इंतजार नहीं करता जब तक सभी श्रमिक नहीं किए जाते हैं, इसलिए परीक्षण में आपको कोई परिणाम नहीं मिल सकता है (जब मुख्य खत्म होता है, सभी शेष कार्य मारे जाते हैं)। आप finish फोन करके ब्लॉक करने के लिए आवश्यकता हो सकती है:
taskPool.finish(true);
डी हल्के धागे के लिए कोई अंतर्निहित कपोल-कल्पना है।इसके बजाय, आप कर सकते हैं:
मैं कुछ की तरह कर सकते हैं: के लिए (int i = 0; i <10; i.parallel) { WRI टेलन ("प्रसंस्करण", i); } ? – Suliman
@ सुलिमान - क्या आप वाक्यविन्यास के बारे में सवाल करते हैं? क्योंकि यह लगभग बिल्कुल ठीक है जो पहले दो करते हैं (दूसरा और अधिक)। आपको taskPool ऑब्जेक्ट का उपयोग करना होगा हालांकि डी आपके लिए नहीं करेगा। – tjameson
हाँ, वाक्यविन्यास के बारे में। – Suliman