मैं देख रहा हूं कि इस प्रश्न का उत्तर एक सक्रियता के साथ दिया गया है, अब यह पूछना कि इसके व्यावहारिक उपयोग क्या yield
हैं। मैं अपने अनुभव से एक उदाहरण दूंगा।
जैसा कि हम जानते हैं, yield
कॉलिंग थ्रेड को प्रोसेसर को छोड़ने के लिए मजबूर करता है जो कि इस पर चल रहा है ताकि दूसरे थ्रेड को चलाने के लिए शेड्यूल किया जा सके। यह तब उपयोगी होता है जब वर्तमान थ्रेड ने अपना काम अभी के लिए समाप्त कर दिया है, लेकिन जल्दी से कतार के सामने लौटना चाहता है और जांचना चाहता है कि क्या कुछ स्थिति बदल गई है। यह एक स्थिति चर से कैसे अलग है? yield
रनिंग स्थिति में बहुत जल्दी लौटने के लिए थ्रेड को सक्षम करता है। जब एक कंडीशन वैरिएबल पर थ्रेड को सस्पेंड किया जाता है और सिग्नल को अलग थ्रेड के लिए प्रतीक्षा करने की आवश्यकता होती है, तो उसे जारी रखना चाहिए।yield
मूल रूप से कहते हैं "एक अलग धागे को चलाने की अनुमति दें, लेकिन मुझे बहुत जल्द काम करने की अनुमति दें क्योंकि मुझे उम्मीद है कि मेरे राज्य में बहुत जल्दी कुछ बदलने की उम्मीद है"। यह व्यस्त कताई की ओर संकेत करता है, जहां एक स्थिति तेजी से बदल सकती है लेकिन धागे को निलंबित करने से एक बड़ा प्रदर्शन प्रभावित होगा।
लेकिन पर्याप्त बड़बड़ा, यहां एक ठोस उदाहरण है: वेवफ्रंट समानांतर पैटर्न। इस समस्या का एक मूल उदाहरण 1s के व्यक्तिगत "द्वीपों" को 0s और 1s से भरे हुए एक द्वि-आयामी सरणी में गणना कर रहा है। एक "द्वीप" उन कोशिकाओं का एक समूह है जो प्रत्येक या तो लंबवत या क्षैतिज रूप से आसन्न होते हैं:
1 0 0 0
1 1 0 0
0 0 0 1
0 0 1 1
0 0 1 1
यहां हमारे पास 1s के दो द्वीप हैं: शीर्ष-बाएं और नीचे-दाएं।
एक सरल उपाय यह है कि पूरे एरे पर पहला पास बनाया जाए और 1 मानों को एक वृद्धिशील काउंटर से बदला जाए, जैसे कि अंत में प्रत्येक 1 को पंक्ति क्रम में इसके क्रम संख्या के साथ बदल दिया गया:
1 0 0 0
2 3 0 0
0 0 0 4
0 0 5 6
0 0 7 8
अगले चरण में, प्रत्येक मूल्य को अपने और अपने पड़ोसियों के मूल्यों के बीच न्यूनतम से बदल दिया जाता है:
1 0 0 0
1 1 0 0
0 0 0 4
0 0 4 4
0 0 4 4
अब हम आसानी से यह निर्धारित कर सकते हैं कि हमारे पास दो द्वीप हैं।
जिस हिस्से को हम समानांतर में चलाना चाहते हैं, वह वह कदम है, जहां हम न्यूनतम गणना करते हैं। बहुत अधिक विस्तार में जाने के बिना, प्रत्येक थ्रेड एक पंक्तिबद्ध तरीके से पंक्तियों को प्राप्त करता है और ऊपर की पंक्ति को संसाधित करने वाले थ्रेड द्वारा गणना मूल्यों पर निर्भर करता है। इस प्रकार, प्रत्येक धागे को पिछली पंक्ति को संसाधित करने वाले थ्रेड के पीछे थोड़ा अंतराल करने की आवश्यकता होती है, लेकिन उचित समय के भीतर भी रखना चाहिए। अधिक विवरण और एक कार्यान्वयन इस दस्तावेज़ में स्वयं द्वारा प्रस्तुत किए गए हैं । ध्यान दें कि sleep(0)
C के बराबर कौन सा उपयोग कम या ज्यादा है yield
।
इस मामले yield
में प्रत्येक धागे को थामने के लिए मजबूर करने के लिए इस्तेमाल किया गया था, लेकिन चूंकि धागा प्रसंस्करण आसन्न पंक्ति बहुत जल्दी इस बीच में आगे बढ़ेगा, एक शर्त चर एक विनाशकारी विकल्प साबित होगा।
जैसा कि आप देख सकते हैं, yield
काफी बढ़िया अनाज अनुकूलन है। गलत जगह पर इसका उपयोग करना, उदाहरण के लिए शायद ही कभी बदलने वाली स्थिति का इंतजार करना, सीपीयू के अत्यधिक उपयोग का कारण होगा।
लंबे प्रलाप के लिए क्षमा करें, आशा है कि मैंने खुद को स्पष्ट कर दिया है।