समवर्तीता के प्रति रस्ट के दृष्टिकोण को समझें जो "निडर समवर्तीता" की अवधारणा पर आधारित है।

कॉन्करेंसी एक प्रोग्राम की एक ही सीपीयू कोर पर एक साथ कई कार्यों को निष्पादित करने की क्षमता है। समवर्ती कार्य समानांतरता के विपरीत, निर्दिष्ट क्रम के बिना ओवरलैपिंग समय में चलते और पूरे होते हैं, जहां एक ही कार्य के विभिन्न कार्य या उप-कार्य एकाधिक के साथ हार्डवेयर पर एक ही समय पर चलते हैं प्रोसेसर.

रस्ट अपनी प्रदर्शन विशेषताओं और सुरक्षित, कुशल तरीके से समवर्ती समर्थन के लिए जाना जाता है। समवर्तीता के प्रति रस्ट का दृष्टिकोण "निडर समवर्तीता" की अवधारणा पर आधारित है जहां भाषा का उद्देश्य सुरक्षित रूप से लिखना आसान बनाना है अपने स्वामित्व और उधार प्रणाली के माध्यम से समवर्ती कोड जो डेटा ट्रेस को रोकने और मेमोरी सुनिश्चित करने के लिए संकलन समय पर सख्त नियम लागू करता है सुरक्षा।

जंग में समवर्तीता को समझना

रस्ट समवर्ती प्रोग्राम लिखने के लिए कई समवर्ती प्राइमेटिव प्रदान करता है, जिसमें थ्रेड, संदेश पासिंग, म्यूटेक्स, परमाणु प्रकार और एसिंक्रोनस प्रोग्रामिंग के लिए एसिंक/प्रतीक्षा शामिल है।

यहां रस्ट की समवर्ती आदिमताओं का अवलोकन दिया गया है:

  1. धागे: जंग एक प्रदान करता है एसटीडी:: धागा थ्रेड बनाने और प्रबंधित करने के लिए इसकी मानक लाइब्रेरी में मॉड्यूल। आप इसके साथ नए सूत्र उत्पन्न कर सकते हैं धागा:: स्पॉन समारोह। धागा:: स्पॉन निष्पादन के लिए कोड युक्त एक क्लोजर लेता है। आप ऐसे थ्रेड भी चला सकते हैं जो समानांतर में चल सकते हैं, और रस्ट उनके निष्पादन को समन्वित करने के लिए सिंक्रोनाइज़ेशन प्रिमिटिव प्रदान करता है। उधार लेने वाला चेकर यह सुनिश्चित करता है कि संदर्भों से अप्रत्याशित व्यवहार न हो।
  2. संदेश देना: रस्ट का समवर्ती मॉडल थ्रेड्स के बीच संदेश भेजने का समर्थन करता है। आप के माध्यम से कार्यान्वित चैनलों का उपयोग करेंगे एसटीडी:: सिंक:: एमपीएससी संदेश भेजने के लिए मॉड्यूल। एक चैनल में एक ट्रांसमीटर होता है (प्रेषक) और एक रिसीवर (रिसीवर). थ्रेड्स ट्रांसमीटर के माध्यम से संदेश भेज सकते हैं और रिसीवर के माध्यम से उन्हें प्राप्त कर सकते हैं। यह धागों के बीच संचार का एक सुरक्षित और समकालिक तरीका प्रदान करता है।
  3. म्यूटेक्स और परमाणु प्रकार: जंग म्यूटेक्स सहित सिंक्रनाइज़ेशन प्रिमिटिव प्रदान करता है (एसटीडी:: सिंक:: म्यूटेक्स) और परमाणु प्रकार (एसटीडी:: सिंक:: परमाणु), विशेष डेटा-साझाकरण पहुंच सुनिश्चित करने के लिए। म्यूटेक्स डेटा रेस को रोकते हुए कई थ्रेड्स को एक साथ डेटा तक पहुंचने की अनुमति देता है। परमाणु प्रकार स्पष्ट लॉकिंग की आवश्यकता के बिना, साझा डेटा पर परमाणु संचालन प्रदान करते हैं, जैसे काउंटर बढ़ाना।
  4. Async/प्रतीक्षा और वायदा: जंग का async/इंतजार सिंटैक्स एसिंक्रोनस कोड लिखने के लिए कार्यक्षमता प्रदान करता है जिसे आप समवर्ती रूप से निष्पादित कर सकते हैं। एसिंक्रोनस प्रोग्राम कुशलतापूर्वक I/O-बाउंड कार्यों से निपटते हैं जिससे प्रोग्राम अन्य I/O परिचालनों की प्रतीक्षा करते हुए अन्य कार्य करने में सक्षम होते हैं। जंग का async/इंतजार वाक्यविन्यास वायदा पर आधारित है, और आप उन्हें इसके साथ शक्ति प्रदान कर सकते हैं async-std या टोकियो रनटाइम लाइब्रेरीज़।

जंग के धागे हल्के होते हैं, और रनटाइम ओवरहेड की अनुपस्थिति उन्हें उच्च-प्रदर्शन अनुप्रयोगों के लिए उपयुक्त बनाती है। रस्ट के समवर्ती प्रिमिटिव विभिन्न समवर्ती आवश्यकताओं के लिए कई पुस्तकालयों और रूपरेखाओं के साथ सहजता से एकीकृत होते हैं।

जंग में स्पॉन धागे का उपयोग कैसे करें

आप इसका उपयोग करेंगे एसटीडी:: धागा धागों को फैलाने के लिए मॉड्यूल। एसटीडी:: थ्रेड:: स्पॉन फ़ंक्शन आपको एक नया थ्रेड बनाने की अनुमति देता है जो आपके प्रोग्राम में मुख्य थ्रेड या किसी अन्य मौजूदा थ्रेड के साथ समवर्ती रूप से चलेगा।

यहां बताया गया है कि आप इसके साथ एक धागा कैसे बना सकते हैं एसटीडी:: थ्रेड:: स्पॉन समारोह:

उपयोग एसटीडी:: धागा;

एफ.एनमुख्य() {
// एक नया सूत्र उत्पन्न करें
होने देना थ्रेड_हैंडल = थ्रेड:: स्पॉन(|| {
// नए थ्रेड में निष्पादित कोड यहां जाता है
println!("नए सूत्र से नमस्ते!");
});

// उत्पन्न धागे के समाप्त होने तक प्रतीक्षा करें
thread_handle.join().unwrap();

// मुख्य थ्रेड में निष्पादित कोड यहां जारी रहता है
println!("मुख्य सूत्र की ओर से नमस्ते!");
}

मुख्य फ़ंक्शन के साथ एक नया थ्रेड बनाता है धागा:: स्पॉन थ्रेड में निष्पादन के लिए कोड वाले क्लोजर को पास करके फ़ंक्शन करें (इस मामले में, क्लोजर एक अज्ञात फ़ंक्शन है)। क्लोजर एक संदेश प्रिंट करता है जो दर्शाता है कि नया थ्रेड चल रहा है।

जोड़ना पर विधि थ्रेड_हैंडल मुख्य थ्रेड को उत्पन्न थ्रेड के निष्पादन पूरा होने तक प्रतीक्षा करने की अनुमति देता है। फोन करके जोड़ना, फ़ंक्शन यह सुनिश्चित करता है कि मुख्य थ्रेड आगे बढ़ने से पहले उत्पन्न थ्रेड के पूरा होने की प्रतीक्षा करता है।

आप कई धागे बना सकते हैं और लूप या किसी अन्य का उपयोग कर सकते हैं जंग नियंत्रण संरचना प्रत्येक के लिए एकाधिक क्लोजर और स्पॉन थ्रेड बनाने के लिए।

उपयोग एसटीडी:: धागा;

एफ.एनमुख्य() {
होने देना num_threads = 5;

होने देनामुठ थ्रेड_हैंडल = सप्ताह![];

के लिए मैं में0..num_threads {
होने देना थ्रेड_हैंडल = थ्रेड:: स्पॉन(कदम || {
println!("थ्रेड की ओर से नमस्ते {}", मैं);
});
थ्रेड_हैंडल.पुश (थ्रेड_हैंडल);
}

के लिए सँभालना में थ्रेड_हैंडल {
हैंडल.जॉइन().अनरैप();
}

println!("सभी सूत्र समाप्त हो गए!");
}

लूप के लिए पांच धागे उत्पन्न होते हैं, प्रत्येक को एक अद्वितीय पहचानकर्ता को सौंपा जाता है मैं लूप वेरिएबल के साथ। क्लोजर का मूल्य कैप्चर करते हैं मैं साथ कदम बचने के लिए कीवर्ड स्वामित्व के मुद्दे, और यह thread_handles वेक्टर थ्रेड्स को बाद के लिए संग्रहीत करता है जोड़ना कुंडली।

सभी धागों को उत्पन्न करने के बाद, मुख्य फ़ंक्शन पुनरावृत्त होता है thread_handles वेक्टर, कॉल जोड़ना प्रत्येक हैंडल पर, और सभी थ्रेड्स के निष्पादित होने की प्रतीक्षा करता है।

चैनलों के माध्यम से संदेश भेजना

आप चैनलों के साथ थ्रेड के माध्यम से संदेश भेज सकते हैं। जंग संदेश भेजने के लिए कार्यक्षमता प्रदान करता है एसटीडी:: सिंक:: एमपीएससी मापांक। यहाँ, एम पी एस सी इसका मतलब है "एकाधिक उत्पादक, एकल उपभोक्ता" और यह चैनलों के माध्यम से संदेश भेजकर और प्राप्त करके कई थ्रेड्स के बीच संचार की अनुमति देता है।

यहां बताया गया है कि आप अपने प्रोग्राम में अंतर-थ्रेड संचार के चैनलों से गुजरने वाले संदेश को कैसे लागू करते हैं:

उपयोग एसटीडी:: सिंक:: एमपीएससी;
उपयोग एसटीडी:: धागा;

एफ.एनमुख्य() {
// एक चैनल बनाएं
होने देना (प्रेषक, रिसीवर) = एमपीएससी:: चैनल();

// एक धागा उत्पन्न करें
धागा:: स्पॉन(कदम || {
// चैनल के माध्यम से एक संदेश भेजें
प्रेषक.भेजें("सूत्र की ओर से नमस्ते!".अनरैप();
});

// मुख्य थ्रेड में संदेश प्राप्त करें
होने देना प्राप्त_संदेश = रिसीवर.recv().unwrap();
println!("प्राप्त संदेश: {}", प्राप्त_संदेश);
}

मुख्य फ़ंक्शन के साथ एक चैनल बनाता है एमपीएससी:: चैनल() जो एक लौटाता है प्रेषक और ए RECEIVER. प्रेषक को संदेश भेजता है RECEIVER जो संदेश प्राप्त करता है। मुख्य फ़ंक्शन थ्रेड्स को उत्पन्न करने और स्वामित्व को स्थानांतरित करने के लिए आगे बढ़ता है प्रेषक धागा बंद करने के लिए. थ्रेड क्लोजर के अंदर, प्रेषक.भेजें() फ़ंक्शन चैनल के माध्यम से एक संदेश भेजता है।

रिसीवर.recv() फ़ंक्शन निष्पादन को रोककर संदेश प्राप्त करता है जब तक कि थ्रेड को संदेश प्राप्त न हो जाए। मुख्य फ़ंक्शन सफल संदेश प्राप्ति के बाद संदेश को कंसोल पर प्रिंट करता है।

ध्यान दें कि चैनल के माध्यम से संदेश भेजने से प्रेषक की खपत होती है। यदि आपको एकाधिक थ्रेड से संदेश भेजने की आवश्यकता है, तो आप प्रेषक को क्लोन कर सकते हैं प्रेषक.क्लोन() समारोह।

इसके अतिरिक्त, एम पी एस सी मॉड्यूल अन्य विधियाँ प्रदान करता है जैसे प्रयास करें_recv(), जो गैर-अवरुद्ध संदेश प्राप्त करने का प्रयास करता है, और iter(), जो प्राप्त संदेशों पर एक पुनरावर्तक बनाता है।

चैनलों के माध्यम से संदेश भेजना डेटा दौड़ से बचने और उचित सिंक्रनाइज़ेशन सुनिश्चित करते हुए थ्रेड्स के बीच संचार करने का एक सुरक्षित और सुविधाजनक तरीका प्रदान करता है।

रस्ट का स्वामित्व और उधार मॉडल मेमोरी सुरक्षा की गारंटी देता है

रस्ट एक मजबूत, सुरक्षित, समवर्ती प्रोग्रामिंग ढांचा प्रदान करने के लिए स्वामित्व, उधार और उधार चेकर को जोड़ती है।

उधार लेने वाला चेकर एक सुरक्षा जाल के रूप में कार्य करता है, जो रनटाइम चेक या कचरा संग्रहण पर भरोसा करने के बजाय संकलन-समय पर संभावित मुद्दों का पता लगाता है।