मुझे समवर्ती प्रोग्रामिंग क्यों पता होना चाहिए?


17

समवर्ती प्रोग्रामिंग मेरे लिए काफी कठिन है: यहां तक ​​कि एक मूल स्लाइड को देखना भी मुझे चुनौतीपूर्ण लगता है। यह इतना सार लगता है।

समवर्ती प्रोग्रामिंग अवधारणाओं को अच्छी तरह से जानने के क्या लाभ हैं? क्या यह मुझे नियमित, अनुक्रमिक प्रोग्रामिंग में मदद करेगा? मुझे पता है कि हमारे कार्यक्रम कैसे काम करते हैं, यह समझने के लिए एक संतुष्टि है, लेकिन और क्या?


3
मुझे लगता है कि यह एक प्रकार का टॉपिक है, लेकिन अगर आप सभी व्यक्तिगत चीजें संपादित करते हैं (हालांकि समवर्ती प्रोग्रामिंग हर किसी के लिए काफी कठिन है ) और अवधारणाओं की ठोस तकनीकी खूबियों के लिए पूछें तो यह बहुत अच्छा हो सकता है ।
यनीस

1
लाभ काफी स्पष्ट होना चाहिए। आप ऐसे प्रोग्राम लिख सकते हैं जो कार्य के विभाजन के माध्यम से उपलब्ध प्रदर्शन संवर्द्धन का लाभ उठा सकते हैं जो समवर्ती प्रोग्रामिंग प्रदान करता है। यह किसी के लिए भी आसान नहीं है। यह आज एक बहुत ही चुनौतीपूर्ण अवधारणा है।
रिग

3
हम आपको कुछ सीखने के लिए प्रेरणा प्राप्त करने में मदद नहीं कर सकते हैं, लेकिन सामान्य प्रश्न के बारे में सामान्य सवाल यह है कि विषय के बारे में जानने के लिए पर्याप्त क्यों है।

2
मैं समवर्ती प्रोग्रामिंग जानता हूं। मैं बता सकता हूं कि आपके द्वारा दी गई स्लाइड समझने में मदद नहीं करती है। इसके बजाय, भोजन करने वाले दार्शनिकों के साथ एक पार्टी में जाएं ।
मौविसील

1
आराम करें, यहां तक ​​कि सबसे बड़ा यह मुश्किल लगता है: Informit.com/articles/article.aspx?p=1193856
SK-logic

जवाबों:


32

यहाँ एक त्वरित और आसान प्रेरणा है: यदि आप कुछ भी करने के लिए कोड, लेकिन छोटी से छोटी, सबसे कमजोर सिस्टम चाहते हैं, आप होगा समवर्ती कोड लिखने जा।

बादल के लिए लिखना चाहते हैं? क्लाउड में कम्प्यूट इंस्टेंस छोटे हैं। आपको बड़े नहीं मिलते, आपको बहुत से छोटे मिलते हैं। अचानक आपका छोटा वेब ऐप एक समवर्ती ऐप है। यदि आपने इसे अच्छी तरह से डिज़ाइन किया है, तो आप ग्राहकों को प्राप्त करने के साथ ही अधिक सर्वर में टॉस कर सकते हैं। और आपको यह सीखना होगा कि आपके उदाहरण का लोड औसत कितना है।

ठीक है, आप डेस्कटॉप ऐप्स लिखना चाहते हैं? सब कुछ एक दोहरे या अधिक-कोर-सीपीयू है। कम से कम महंगी मशीनों को छोड़कर। और कम से कम महंगी मशीनों वाले लोग शायद आपके महंगे सॉफ़्टवेयर के लिए कांटा नहीं लगा रहे हैं, क्या वे हैं?

शायद आप मोबाइल विकास करना चाहते हैं? अरे, iPhone 4S में डुअल-कोर सीपीयू है। बाकी बहुत पीछे नहीं रहेंगे।

वीडियो गेम? Xbox 360 एक बहु-सीपीयू प्रणाली है, और सोनी का PS3 अनिवार्य रूप से एक बहु-कोर प्रणाली है।

जब तक आप छोटी, सरल समस्याओं पर काम नहीं कर रहे, तब तक आप समवर्ती प्रोग्रामिंग से दूर नहीं हो सकते।

2016 का अपडेट : $ 35 रास्पबेरी पाई का वर्तमान पुनरावृत्ति सेल फोन के लिए बनाई गई चिप पर क्वाड-कोर सिस्टम के आसपास बनाया गया है। समानांतर कम्प्यूट इंजन के रूप में हाई-एंड ग्राफिक्स कार्ड की उपलब्धता के कारण AI में नाटकीय प्रगति हुई है।


1
जबकि मैं सिद्धांत रूप में सहमत हूं, यह कहने के लिए कि Everything has a dual-or-more-core-CPU. Except the least expensive machines.थोड़ा पूर्वसिद्ध लगता है। बहुत से लोगों के पास सिंगल-कोर मशीनें हैं, इसलिए नहीं कि यह सस्ता था, बल्कि इसलिए कि वे जो उनके पास हैं उससे खुश हैं और उन्हें अपग्रेड करने की कोई आवश्यकता नहीं है। कहा कि, संगामिति के संदर्भ में सोचने से एकल-कोर प्रणाली पर अनुसूचक को मदद मिलेगी, इसलिए यह व्यर्थ प्रयास नहीं है कहीं भी आप प्रीमेप्टिव मल्टीटास्किंग मान सकते हैं, या तो (जो कि प्रत्येक मल्टीटास्किंग वातावरण के बारे में है, अधिकांश डेवलपर्स के संपर्क में आएंगे,) इन दिनों)।
बजे एक CVn

1
ठीक है - यह थोड़ा अतिशयोक्ति है, लेकिन नया हार्डवेयर बहु-कोर होने के लिए भारी है। मुझे लगता है कि दूर जा रहा नहीं है। इसलिए यदि आप एक छात्र हैं, तो आज आप उस काम के बारे में सोच रहे हैं जो आप भविष्य में पेशेवर रूप से करेंगे, यह मान लेना सुरक्षित है कि आप मल्टीकोर सिस्टम पर काम कर रहे होंगे।
ऑब्स्क्योररॉट

मुझे आश्चर्य है कि अगर मैं आपके जवाब से असहमत हूं, जितना आप मेरे साथ असहमत हैं;)

1
जिस तरह से मैंने इसे पढ़ा है, हम दोनों को जो कह रहे हैं, उसके समान समानता का एक कर्नेल है, @ acidzombie24। मैं कह रहा हूं कि एक डेवलपर को यह पता होना चाहिए कि कैसे संगामिति से निपटना है क्योंकि यह हर जगह होगा। आप कह रहे हैं कि आपको जब तक समवर्ती प्रोग्रामिंग में अच्छा नहीं होना है ... समवर्ती प्रणालियों के नुकसान से बचें :)
अस्पष्ट

मैं मानता हूं कि यह संगोष्ठी के बारे में जानने के लिए बहुत उपयोगी है, लेकिन असहमत आप केवल "छोटी, सरल समस्याओं" के लिए इससे दूर हो सकते हैं। आप गैर-तुच्छ प्रणालियों में भी संगामिति से दूर हो सकते हैं, उदाहरण के लिए यदि आप मौजूदा रूपरेखाओं और एप्लिकेशन सर्वरों पर भरोसा करते हैं। एक बार इंफ्रास्ट्रक्चर हो जाने के बाद, मैं एक जूनियर डेवलपर बन सकता हूं जो एक वेब ऐप के लिए नई सेवाएं लिख रहा है और संक्षिप्तता या समानता के बारे में लगभग कुछ भी नहीं जानता है।
एंड्रेस एफ।

21

1970 से लेकर लगभग 2002 के प्रोसेसर हर 18 महीनों में लगभग दोगुने हो गए। तो एक प्रोग्रामर के रूप में आप सभी को इंतजार करना था और आपका कार्यक्रम तेजी से आगे बढ़ेगा। समस्या यह है कि 2002 के आसपास नियम बदल गए। अब वे बड़े तेज प्रोसेसर नहीं बना रहे हैं, वे छोटे धीमे प्रोसेसर बना रहे हैं, लेकिन उन्हें समूहों में बाहर कर रहे हैं। अब मैं जिस कंप्यूटर पर काम कर रहा हूं, उसमें 4 कोर हैं, और 8 कोर (और प्रति कोर 4 धागे) के साथ चिप्स मौजूद हैं। जल्द ही हमारे पास बहुत अधिक कोर के साथ चिप्स होंगे।

इसलिए यदि आप एक प्रोग्राम लिखते हैं जो बिल्कुल समवर्ती नहीं है, तो आप पाएंगे कि आप 1 कोर या थ्रेड का उपयोग कर रहे हैं, लेकिन बाकी सीपीयू वहाँ बैठकर कुछ भी नहीं कर रहा है। तो अगर आपके पास 16 कोर 1 है तो आप अपना प्रोग्राम चलाएंगे और बाकी 15 वहीं बैठे हैं!

समवर्ती के साथ समस्या यह है कि यह गैर नियतात्मक है। यह कहना है कि आप बिल्कुल नहीं जानते कि विभिन्न धागे किस क्रम में चीजें करेंगे। परंपरागत रूप से प्रोग्रामर ने ताले और इस तरह का उपयोग करके इसे हल करने की कोशिश की है। इससे बहुत दर्द होता है। परिवर्तनशील अवस्था के कुछ ऐसे रूप होने से जो एक से अधिक धागे तक स्वतंत्र रूप से पहुंच सकते हैं, अक्सर दर्द और हेस्नेबग्स के लिए एक सूत्र है!

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

दूसरी विधि एसटीएम है, जो सॉफ्टवेयर ट्रांसक्रिप्शनल मेमोरी के लिए है, यह क्लोजर और हास्केल (और अन्य) में मौजूद है। एसटीएम मेमोरी में साझा किया जाता है लेकिन परिवर्तन केवल लेनदेन के माध्यम से किया जा सकता है। जैसा कि डेटाबेस के लोगों ने यह सारा सामान 1970 में खोजा, यह सुनिश्चित करना बहुत आसान है कि हम इसे सही समझें।

वास्तव में मैंने थोड़ा सा सरलीकरण किया, क्लोजर और हास्केल दोनों संदेश पारित कर सकते हैं, और एर्लैंग एसटीएम कर सकते हैं।

अस्वीकरण मैं एरलांग के साथ प्रोग्रामिंग वेब सर्विसेज का लेखक हूं , जो अगले कुछ हफ्तों में प्रारंभिक रिलीज में बाहर हो जाएगा।


1
@Zachary K: क्या ऐसे तरीके हैं जो कार्यात्मक भाषाओं को देशी भाषाओं के साथ मिलाते हैं ताकि गणना-गहन भागों को मूल भाषा में लागू किया जा सके लेकिन वे ऐसे इंटरफेस प्रदान करते हैं जो कार्यात्मक भाषा में लिखे गए सर्वर द्वारा उपभोग किए जा सकते हैं?
रवांग

100% निश्चित नहीं है, लेकिन क्लोजर और स्काला दोनों ही जेवीएम पर मौजूद हैं, इसलिए मैं यही शुरू करूंगा। शायद अक्का ढांचे पर एक नज़र डालें। मैंने इसे इस्तेमाल नहीं किया है, लेकिन थोड़ी देर पहले अक्का के बारे में बात सुनी थी और ऐसा लगता है कि यह बहुत अच्छा हो सकता है। अभी के लिए मैं एर्लैंग और जावास्क्रिप्ट कर रहा हूं जो मेरा अधिकांश समय ले रहा है!
ज़ाचरी के

1
@rwong: .NET प्रोग्रामर्स को उनके एप्लिकेशन के कुछ हिस्सों के लिए C # या अन्य गैर-कार्यात्मक भाषाओं का उपयोग करने देता है और F #, एक कार्यात्मक भाषा, दूसरों के लिए।
केविन

5

क्योंकि जब आप इसे कम से कम उम्मीद करते हैं तो आपके चेहरे पर हवा चल सकती है ...


4
+1000000000000000000000000000000000000


1
@ObscureRobot दो बार मजाकिया रूप में! (स्पष्टीकरण की जरूरत नहीं थी :
फोरट्रान

4

समवर्ती प्रोग्रामिंग का पहला नियम "यह मुश्किल है"। समवर्ती प्रोग्रामिंग का दूसरा नियम "यह है। मुश्किल है" .. !!

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

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

इन सबका फायदा यह है कि एक बार जब आप समझ जाते हैं कि आप अंतर्निहित हार्डवेयर का अधिक प्रभावी ढंग से उपयोग करने में सक्षम हैं। इन दिनों यह प्रोसेसर के लिए कई कोर होने के लिए बहुत अधिक आदर्श है। समवर्ती प्रोग्रामिंग का उपयोग करके आप इन कोर को अपने लिए काम कर सकते हैं, और आपके एप्लिकेशन को गति में सुधार मिलेगा।

नुकसान यह है कि आपको यह सोचना शुरू करना होगा कि आप अपने आवेदन को छोटे भागों में कैसे विभाजित करेंगे जो विभिन्न थ्रेड्स पर चलाए जा सकते हैं। यह एक बहुत कठिन है जितना लगता है। इसके अलावा, अत्यधिक समवर्ती समाधान इकाई परीक्षण के लिए अजीब हो सकते हैं क्योंकि निष्पादन का क्रम कम निर्धारक है।

इन दिनों अधिकांश भाषाएं जीवन को थोड़ा आसान बनाने के लिए अधिकांश समवर्ती प्राइमरी पर अमूर्तता के साथ जहाज बनाती हैं। उदाहरण के लिए, टास्क पैरेलल लाइब्रेरी के साथ .NET 4 जहाज जो जीवन को थोड़ा आसान बनाते हैं। जावा भूमि में उन्हें कॉनसेरी पैकेज मिला है ।


1
यदि आप जितनी जल्दी हो सके ताले से भाग जाएं तो इसे परिमाण के आदेश मिलते हैं। एसटीएम या अभिनेताओं और आपके द्वारा कही गई सभी बातों का उपयोग करें। बेशक इसका मतलब है कि जावा से स्कैला, एर्लांग या क्लोजर जैसी भाषाओं में जाना। (हालांकि मैं तर्क दूंगा कि यह भी एक अच्छी बात है)
Zachary K

@Zachary: यह एक अच्छी बात हो सकती है, लेकिन अगर आप एक .NET शॉप में काम कर रहे हैं, उदाहरण के लिए, यह व्यावहारिक नहीं है। एसटीएम भविष्य में एक विकल्प हो सकता है, लेकिन अभी यह मुख्यधारा की भाषाओं में एक विकल्प नहीं है।
शॉन

क्लोजर .net पर चलता है, और एफ # है। मैं शर्त लगाता हूँ कि C # के लिए STM कार्यान्वयन भी हैं।
ज़ाक्रि के

3

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

PHP के साथ काम करते हुए, मैंने पुराने तरीके से काम किया, और कुछ घंटों के काम के बाद मैंने जो सबसे अच्छा समय प्राप्त किया, उसके परिणामस्वरूप ~ 120 सेकंड एक निश्चित परीक्षा (कई अनुरोधों + नेटवर्क विलंब + नो एस्किंस) चलाने के लिए आया

लेकिन जो मेरी ज़रूरत थी उसकी तुलना में लगभग पर्याप्त नहीं था, और PHPs के साथ कई गुना असफल होने के बाद, मैंने पायथन पर स्विच किया।

कुछ घंटों के बाद, मेरे पास एक चलित पाइथन मल्टीप्रोसेसिंग स्क्रिप्ट थी जो कि 20 सेकंड में चलती थी, और टाइमआउट्स के साथ थोड़ी सी गड़गड़ाहट के बाद और नहीं। थ्रेड्स का उपयोग करने के लिए, मैंने इसे ~ 10 सेकंड के लिए नीचे कर दिया ।

यह PHP में 100% लिखी गई वेबसाइट के लिए था, एक सिंगल, 100 लाइन पायथन स्क्रिप्ट को छोड़कर। और पूरी बात सही काम कर रही है।

मेरा निष्कर्ष यह होगा कि भले ही यह आपको एक दिन के आधार पर मदद नहीं करेगा, आप ऐसी परिस्थितियों का सामना कर सकते हैं जहां कम से कम समवर्ती प्रोग्रामिंग की मूल बातें जानने से आपको बहुत मदद मिलेगी।

गुड लक, और खुश कोडिंग!

पुनश्च: मैं PHP को काटने की कोशिश नहीं कर रहा हूं, लेकिन PHP बस हाथ में काम के लिए सही उपकरण नहीं था।

PS2: एक नई तकनीक, या चीजों को करने का एक नया तरीका जानने से संभावनाओं की एक नई दुनिया का द्वार खुल सकता है।


2

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


-1

ऑपरेटिंग सिस्टम की अंतर्दृष्टि जानें। अनुसूचियों और डिवाइस ड्राइवरों के स्रोत कोड को पढ़ने से मदद मिलेगी; वे निश्चित रूप से समवर्ती हैं।


2
प्रोग्रामर के लिए प्रायिकता आमतौर पर कई उदाहरणों में चल रहे आपके अपने कार्यक्रमों के लिए जाती है।

मैंने इस बात पर जोर देने का प्रयास किया कि आप ओएस कर्नेल के शेड्यूलिंग एल्गोरिथ्म के विवरण को जाने बिना वैसे भी अपना स्वयं का समवर्ती कार्यक्रम नहीं लिख सकते।
jj1bdx

क्यों नहीं? यदि आप लॉकिंग तंत्र का सही तरीके से उपयोग करते हैं, तो ओएस शेड्यूलिंग एल्गोरिदम महत्वहीन है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.