Concurrency: आप डिज़ाइन के बारे में क्या सोचते हैं और कार्यान्वयन को डिबग करते हैं?


37

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

हालाँकि, मुझे पता है कि आप जो करने का इरादा रखते हैं, उसकी कल्पना करने में मदद करने के लिए बहुत कम उपकरण हैं, और यह सत्यापित करें कि आप कम से कम अपनी मूल दृष्टि के करीब हैं। समवर्ती कोड को डीबग करना उन भाषाओं के साथ एक बुरा सपना हो सकता है जो संगामिति के लिए डिज़ाइन नहीं किए गए हैं (जैसे C / C ++, C #, Java, आदि)। विशेष रूप से, आपके विकास के वातावरण में एक प्रणाली पर आसानी से होने वाली स्थितियों को फिर से बनाना असंभव हो सकता है।

तो, संगामिति और समानांतर प्रसंस्करण से निपटने के लिए एक प्रणाली को डिजाइन करने के लिए आपके दृष्टिकोण क्या हैं? उदाहरण:

  • आप कैसे पता लगा सकते हैं कि समवर्ती क्या बनाया जा सकता है बनाम क्या अनुक्रमिक होना चाहिए?
  • आप त्रुटि की स्थिति को कैसे पुन: उत्पन्न करते हैं और देखते हैं कि आवेदन निष्पादित होने के समय क्या हो रहा है?
  • आप आवेदन के विभिन्न समवर्ती भागों के बीच बातचीत की कल्पना कैसे करते हैं?

इनमें से कुछ के लिए मेरे अपने जवाब हैं, लेकिन मैं थोड़ा और सीखना चाहूंगा।

संपादित करें

अभी तक हमारे पास बहुत सारे अच्छे इनपुट हैं। लिंक किए गए कई लेख बहुत अच्छे हैं, और मैं उनमें से कुछ को पहले ही पढ़ चुका हूं।

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

बाउंटी के लिए गोल

मुझे मत बताना कि मुझे क्या करना चाहिए। मेरे पास पहले से ही नियंत्रण में है। मुझे बताओ तुम क्या करते हो। मुझे बताएं कि आप इन समस्याओं को कैसे हल करते हैं।


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

अब तक, हमारे पास कुछ अच्छे उत्तर हैं। कोई भी व्यक्ति चाहता है कि आप इस क्षेत्र में आपकी मदद करने के लिए क्या चाहते हैं?
बेरिन लोरिट्सच 15

समवर्ती कोडिंग के लिए TotalView डीबगर एक बहुत उपयोगी उपकरण है, हालांकि सीखने की अवस्था में थोड़ा सा लेता है - Totalviewtech.com/products/totalview.html
Fanatic23 9:10

शायद लॉगिंग आपको दो अंतिम प्रश्नों में मदद कर सकती है।
अमीर रज़ाई

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

जवाबों:


11

मैं अब कई वर्षों के लिए समवर्ती प्रणाली विकसित कर रहा हूं, और मेरे पास औपचारिक प्रशिक्षण (यानी एक डिग्री) की कमी के बावजूद इस विषय पर बहुत अच्छी समझ है।

सबसे अच्छे प्रोग्रामर जिन्हें मैं जानता हूं उनमें से कई विश्वविद्यालय खत्म नहीं करते। मेरे लिए मैंने दर्शनशास्त्र का अध्ययन किया।

सी / सी ++, सी #, जावा, आदि)। विशेष रूप से, आपके विकास के वातावरण में एक प्रणाली पर आसानी से होने वाली स्थितियों को फिर से बनाना असंभव हो सकता है।

हाँ

आप कैसे पता लगा सकते हैं कि समवर्ती क्या बनाया जा सकता है बनाम क्या अनुक्रमिक होना चाहिए?

हम आमतौर पर एक 1000 मील ऊंचे रूपक के साथ शुरू करते हैं ताकि हम अपनी वास्तुकला को खुद (सबसे पहले) और दूसरे (दूसरे) को स्पष्ट कर सकें।

जब हमने उस समस्या का सामना किया, तो हमने हमेशा समवर्ती वस्तुओं की दृश्यता को गैर समवर्ती लोगों तक सीमित करने का एक तरीका खोजा।

हाल ही में मैंने एक्टर्स को स्कैला में खोजा और मैंने देखा कि मेरे पुराने समाधान एक प्रकार के "मिनिएक्टर" थे, जो स्कैल्स की तुलना में बहुत कम शक्तिशाली थे। इसलिए मेरा सुझाव वहां से शुरू करना है।

एक अन्य सुझाव यह है कि जितनी संभव हो उतनी समस्याओं को छोड़ दें: उदाहरण के लिए हम केंद्रीयकृत कैश (टेराकोटा) का उपयोग स्मृति में नक्शे रखने के बजाय, सिंक्रनाइज़ किए गए तरीकों के बजाय इनर क्लास कॉलबैक का उपयोग करने, साझा स्मृति लिखने के बजाय संदेश भेजने आदि के लिए करते हैं।

स्काला के साथ वैसे भी यह सब बहुत आसान है।

आप त्रुटि की स्थिति को कैसे पुन: उत्पन्न करते हैं और देखते हैं कि आवेदन निष्पादित होने के समय क्या हो रहा है?

यहाँ कोई वास्तविक उत्तर नहीं है। कंसीडर के लिए हमारे पास कुछ यूनिट टेस्ट है और हमारे पास एप्लिकेशन को जितना हो सके उतना स्ट्रेस करने के लिए लोड टेस्ट सूट है।

आप आवेदन के विभिन्न समवर्ती भागों के बीच बातचीत की कल्पना कैसे करते हैं?

फिर से कोई वास्तविक उत्तर नहीं: हम अपने रूपक को व्हाइटबोर्ड पर डिज़ाइन करते हैं और हम यह सुनिश्चित करने की कोशिश करते हैं कि वास्तुशिल्प पर कोई टकराव नहीं है।

आर्क के लिए मेरा मतलब नील फोर्ड की परिभाषा है: स्व वास्तुकला वह सब कुछ है जिसे बाद में बदलना बहुत कठिन होगा।

प्रोग्रामिंग मुझे विश्वास दिलाता है कि आपको अनुक्रमिक प्रोग्रामिंग के साथ एक अलग मानसिकता की आवश्यकता है।

हो सकता है लेकिन मेरे लिए यह केवल एक समानांतर तरीके से सोचने के लिए असंभव है, इसलिए हमारे सॉफ़्टवेयर को इस तरह से डिज़ाइन करें कि समवर्ती सोच के बीच दुर्घटनाओं से बचने के लिए समानांतर सोच के साथ और स्पष्ट रेलिंग की आवश्यकता न हो।


6

मुझे डेटा के बारे में सब है। अपने डेटा को सही तरीके से तोड़ें, और समानांतर प्रसंस्करण आसान है। अवधारण, गतिरोध, और इसी तरह सभी समस्याएं दूर हो जाती हैं।

मुझे पता है कि यह केवल समानांतर करने का एकमात्र तरीका नहीं है, लेकिन मेरे लिए यह सबसे उपयोगी है।

वर्णन करने के लिए, (नहीं-तो-जल्दी) कहानी:

मैंने 2009 के माध्यम से 2007 में एक बड़े वित्तीय (स्टॉक-मार्केट कंट्रोल) सिस्टम पर काम किया था, और डेटा की प्रसंस्करण मात्रा बहुत बड़ी थी। वर्णन करने के लिए, एक ग्राहक के 1 एकल खाते में की गई सभी गणनाओं ने उनके औसत कार्य केंद्र पर लगभग 1 ~ 3 सेकंड का समय लिया, और 30k से अधिक खाते थे। हर रात, सिस्टम को बंद करना उपयोगकर्ताओं के लिए एक बड़ा दर्द था (आमतौर पर 6 घंटे से अधिक प्रसंस्करण, उनके लिए कोई त्रुटि-मार्जिन के बिना)।

इस समस्या का अध्ययन करने पर पता चला कि हम कई कंप्यूटरों के बीच गणना को लकवाग्रस्त कर सकते हैं, लेकिन हमारे पास अभी भी पुराने डेटाबेस सर्वर (SQL 2000 में SQL 6.5 का अनुकरण करने वाला सर्वर) पर एक बड़ी अड़चन है।

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

1) एक एकल निर्माता, या तो डेटाबेस को पढ़ने या उस पर लिखने के लिए जिम्मेदार है, क्रमिक रूप से। यहां कोई भी अनुमति नहीं है। निर्माता ने उपभोक्ताओं के लिए नौकरियों की एक कतार तैयार की। डेटाबेस केवल इस निर्माता का था।

2) कई उपभोक्ताओं, कई मशीनों पर। उपभोक्ताओं में से प्रत्येक ने गणना करने के लिए तैयार, कतार से डेटा का एक पूरा पैकेट प्राप्त किया। प्रत्येक deqeue ऑपरेशन सिंक्रनाइज़ है।

3) गणना के बाद, प्रत्येक उपभोक्ता ने डेटा को जारी रखने के लिए, डेटा को एक इन-मेमोरी सिंक्रोनाइज्ड कतार निर्माता को वापस भेज दिया।

कई चेक-पॉइंट थे, लेनदेन को आश्वस्त करने के लिए कई तंत्र सही ढंग से सहेजे गए थे (कोई भी पीछे नहीं छोड़ा गया था), लेकिन पूरा काम इसके लायक था। अंत में, गणना 10 कंप्यूटरों के बीच फैल गई (निर्माता / कतार कंप्यूटर) पूरे सिस्टम को 15 मिनट के लिए बंद करने के समय को नीचे ले गया।

बस गरीब संगामिति प्रबंधन SQL 6.5 की वजह से अवधारण समस्याओं को दूर कर हमें एक बड़ा फायदा दिया था। बाकी बहुत अधिक रैखिक था, "ग्रिड" में जोड़े गए प्रत्येक नए कंप्यूटर ने प्रसंस्करण समय को नीचे कर दिया, जब तक कि हम डेटाबेस पर अनुक्रमिक पढ़ने / लिखने के संचालन की "अधिकतम दक्षता" तक नहीं पहुंच गए।


2

मल्टी-थ्रेडिंग वातावरण में काम करना कठिन है और कोडिंग अनुशासन की आवश्यकता है। आपको लॉक लेने, लॉक जारी करने, वैश्विक चर का उपयोग करने आदि के लिए उचित दिशानिर्देश का पालन करने की आवश्यकता है।

मुझे एक-एक करके अपने प्रश्न का उत्तर देने का प्रयास करें

* How do you figure out what can be made concurrent vs. what has to be sequential?

के लिए कंसीडर का उपयोग करें

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

2) जिन परिचालनों में आई / ओ भारी है, उन्हें समानांतर बनाया जा सकता है। सबसे अच्छा उदाहरण लकड़हारा है। लकड़हारा धागा एक अलग धागा हो सकता है।

3) विभिन्न डेटा पर समान कार्य। यदि कोई कार्य है जो विभिन्न डेटा पर होता है लेकिन प्रकृति में बहुत समान है, तो अलग-अलग धागे यह कर सकते हैं। सबसे अच्छा उदाहरण सर्वर अनुरोध होगा।

और निश्चित रूप से कई अन्य इस तरह आवेदन के आधार पर पसंद करते हैं।

* How do you reproduce error conditions and view what is happening as the application executes?

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

* How do you visualize the interactions between the different concurrent parts of the application?

लॉग को अपने ताले में रखें, ताकि आपको पता चल जाएगा कि कौन लॉक कर रहा है क्या और कब, और किसने लॉक के लिए प्रयास किया है। जैसा कि मैंने पहले कहा था कि प्रत्येक थ्रेड में क्या चल रहा है यह समझने के लिए लॉग में थ्रेड आईडी लगाने की कोशिश करें।

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


2
  • आप कैसे पता लगा सकते हैं कि समवर्ती क्या बनाया जा सकता है बनाम क्या अनुक्रमिक होना चाहिए?

मैं पहले सवाल करूंगा कि क्या आवेदन (या घटक) वास्तव में समवर्ती प्रसंस्करण से लाभ उठाएगा, या आम आदमी की शर्तों में - कहां अड़चन है? Concurrency स्पष्ट रूप से हमेशा निवेश के लिए एक लाभ प्रदान नहीं करेगा जो इसे काम करने के लिए लेता है। यदि यह एक उम्मीदवार की तरह दिखता है, तो मैं नीचे काम करूंगा - सबसे बड़ा ऑपरेशन या संचालन के सेट को खोजने की कोशिश करना जो अपना काम प्रभावी ढंग से अलगाव में कर सकता है - मैं तुच्छ, लागत-अप्रभावी के लिए धागे को स्पिन नहीं करना चाहता हूं संचालन - मुझे अभिनेताओं की तलाश है ।

एर्लैंग के साथ काम करना मुझे अतुल्यकालिक संदेश पास करने की अवधारणा से प्यार है और संगामिति के लिए अभिनेता मॉडल - यह सहज, प्रभावी और स्वच्छ है।

के बंद को समझना अभिनेता कन्करेंसी

अभिनेता मॉडल में कुछ प्रमुख सिद्धांत शामिल हैं:

  • कोई साझा राज्य नहीं
  • हल्के प्रक्रियाओं
  • अतुल्यकालिक संदेश-गुजरना
  • आने वाले संदेशों को बफर करने के लिए मेलबॉक्स
  • पैटर्न मिलान के साथ मेलबॉक्स प्रसंस्करण

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

Erlang संगामिति मॉडल लॉक करना और साझा किए गए डेटा की तुलना में समझना और डीबग करना आसान है। जिस तरह से आपके तर्क को अलग-थलग कर दिया जाता है, उन्हें संदेशों को पास करके घटकों का परीक्षण करना आसान होता है।

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

यह मॉडल Erlang अनन्य नहीं है, यहां तक ​​कि जावा और .NET की दुनिया में भी इसे बनाने के तरीके मौजूद हैं - मैं कॉन्सिक्वेंसी एंड कोऑर्डिनेशन रनटाइम (CCR) और रिलैंग (जावा के लिए जेटलैंग भी है) को देखूंगा।

  • आप त्रुटि की स्थिति को कैसे पुन: उत्पन्न करते हैं और देखते हैं कि आवेदन निष्पादित होने के समय क्या हो रहा है?

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

  • आप आवेदन के विभिन्न समवर्ती भागों के बीच बातचीत की कल्पना कैसे करते हैं?

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


1

- मेरे उत्तर एमएस / विजुअल स्टूडियो विशिष्ट हैं -

आप कैसे पता लगा सकते हैं कि समवर्ती क्या बनाया जा सकता है बनाम क्या अनुक्रमिक होना चाहिए?

यह डोमेन ज्ञान लेने जा रहा है, इसे कवर करने के लिए यहां कोई कंबल बयान नहीं होगा।

आप त्रुटि की स्थिति को कैसे पुन: उत्पन्न करते हैं और देखते हैं कि आवेदन निष्पादित होने के समय क्या हो रहा है?

लॉगिंग के बहुत सारे, उत्पादन में इसे पकड़ने के लिए उत्पादन अनुप्रयोगों में लॉगिंग चालू / बंद / चालू करने में सक्षम होना। VS2010 Intellitrace को इसके साथ मदद करने में सक्षम माना जाता है, लेकिन मैंने अभी तक इसका उपयोग नहीं किया है।

आप आवेदन के विभिन्न समवर्ती भागों के बीच बातचीत की कल्पना कैसे करते हैं?

मेरे पास इस बारे में अच्छा जवाब नहीं है, मैं एक देखना पसंद करूंगा।


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

1

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

मैं अपनी पूरी क्षमता से, इस विचार के साथ ताले को लागू करने की कोशिश करता हूं कि आखिरकार, वास्तव में व्यावहारिक लॉक फ्री प्रोग्रामिंग मेरे लिए एक वास्तविकता बन सकती है। ताला लगाकर, मेरा मतलब आपसी बहिष्कार से नहीं है, मेरा मतलब सिर्फ एक प्रक्रिया है जो मध्यस्थता की आवश्यकता के बिना सुरक्षित संगति लागू करता है। व्यावहारिक रूप से, मेरा मतलब कुछ ऐसा है जिसे लागू करने की तुलना में पोर्ट करना आसान है। मेरे पास बहुत कम औपचारिक सीएस प्रशिक्षण है, लेकिन मुझे लगता है कि मुझे इच्छा की अनुमति है :)

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

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

फिर से, वहाँ 'वितरित' फेंक दें और मध्यस्थता एक आवश्यक हो जाए। क्या आपके पास एक विशिष्ट उदाहरण है?


मेरे कथन को स्पष्ट करने के लिए, C को विशेष रूप से और समवर्ती के लिए डिज़ाइन नहीं किया गया था। यह गो, एर्लैंग और स्काला जैसी भाषाओं के विपरीत है, जिन्हें स्पष्ट रूप से मन में संगति के साथ डिजाइन किया गया था। मैं यह कहने का इरादा नहीं कर रहा था कि आप सी। के साथ
संगति

1

आप त्रुटि की स्थिति को कैसे पुन: उत्पन्न करते हैं और देखते हैं कि आवेदन निष्पादित होने के समय क्या हो रहा है?

आप आवेदन के विभिन्न समवर्ती भागों के बीच बातचीत की कल्पना कैसे करते हैं?

मेरे अनुभव के आधार पर, इन दो पहलुओं का उत्तर इस प्रकार है:

ट्रेसिंग वितरित की गई

वितरित अनुरेखण वह तकनीक है जो आपके सिस्टम के प्रत्येक व्यक्तिगत समवर्ती घटक के लिए समय डेटा को कैप्चर करती है, और इसे आपको ग्राफिकल प्रारूप में प्रस्तुत करती है। समवर्ती निष्पादन के प्रतिनिधियों को हमेशा इंटरलेय किया जाता है, जिससे आप देख सकते हैं कि समानांतर में क्या चल रहा है और क्या नहीं है।

वितरित अनुरेखण वितरित (निश्चित रूप से) वितरित प्रणालियों में इसकी उत्पत्ति का कारण बनता है, जो कि परिभाषा अतुल्यकालिक और अत्यधिक समवर्ती हैं। वितरित अनुरेखण के साथ एक वितरित प्रणाली लोगों को सक्षम बनाती है:

क) महत्वपूर्ण अड़चनों की पहचान करें, ख) आपके आवेदन के आदर्श 'रन' का एक दृश्य प्रतिनिधित्व प्राप्त करता है, और ग) समवर्ती व्यवहार को निष्पादित करने में दृश्यता प्रदान करता है, घ) समय डेटा प्राप्त करता है जिसका उपयोग आपके परिवर्तनों के बीच अंतर का आकलन करने के लिए किया जा सकता है। प्रणाली (अत्यंत महत्वपूर्ण है अगर आपके पास मजबूत SLAs है)।

वितरित अनुरेखण के परिणाम हालांकि, हैं:

  1. यह आपके सभी समवर्ती प्रक्रियाओं में ओवरहेड जोड़ता है, क्योंकि यह नेटवर्क पर संभावित रूप से निष्पादित करने और सबमिट करने के लिए अधिक कोड में अनुवाद करता है। कुछ मामलों में, यह ओवरहेड अत्यधिक महत्वपूर्ण है - यहां तक ​​कि Google केवल सभी अनुरोधों के एक छोटे से सबसेट पर अपने ट्रेसिंग सिस्टम डैपर का उपयोग करता है ताकि उपयोगकर्ता अनुभव को बर्बाद न करें।

  2. कई अलग-अलग उपकरण मौजूद हैं, जिनमें से सभी एक-दूसरे के साथ परस्पर जुड़े नहीं हैं। यह कुछ हद तक OpenTracing जैसे मानकों से समृद्ध है, लेकिन पूरी तरह से हल नहीं हुआ है।

  3. यह आपको साझा संसाधनों और उनकी वर्तमान स्थिति के बारे में कुछ नहीं बताता है । आप अनुमान लगा सकते हैं कि एप्लिकेशन कोड और आपके द्वारा देखा जाने वाला ग्राफ़ आपको दिखा रहा है, लेकिन यह इस संबंध में एक उपयोगी उपकरण नहीं है।

  4. वर्तमान उपकरण मान लेते हैं कि आपके पास मेमोरी और स्टोरेज है। एक समय सर्वर को होस्ट करना आपके अवरोधों के आधार पर सस्ता नहीं हो सकता है।

सॉफ्टवेयर को ट्रैक करने में त्रुटि

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

समवर्ती कोड में इस तरह के समर्पित सॉफ्टवेयर का शुद्ध लाभ:

  1. डुप्लिकेट त्रुटियां डुप्लिकेट नहीं हैं । दूसरे शब्दों में, यदि एक या अधिक समवर्ती सिस्टम एक ही अपवाद सामना करते हैं, संतरी जाएगा बढ़ाने के एक घटना की रिपोर्ट है, लेकिन घटना की दो प्रतियां प्रस्तुत नहीं।

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

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

  1. आप अपने रनटाइम अपवादों के साथ अतिरिक्त विवरण प्रदान करने के लिए इस त्रुटि से निपटने वाले सॉफ़्टवेयर को संशोधित कर सकते हैं। प्रक्रिया के क्या खुले संसाधन थे? क्या कोई साझा संसाधन है जो इस प्रक्रिया को पकड़े हुए था? किस उपयोगकर्ता को इस समस्या का अनुभव हुआ?

यह, सावधानीपूर्वक स्टैक निशान (और स्रोत नक्शे के अलावा, यदि आपको अपनी फ़ाइलों का एक छोटा संस्करण प्रदान करना है), यह निर्धारित करना आसान बनाता है कि समय का एक बड़ा हिस्सा क्या हो रहा है।

  1. (संतरी-विशिष्ट) आपके पास सिस्टम के टेस्ट रन के लिए एक अलग सेंट्री रिपोर्टिंग डैशबोर्ड हो सकता है, जिससे आप परीक्षण में त्रुटियों को पकड़ सकते हैं।

इस तरह के सॉफ्टवेयर के नुकसान में शामिल हैं:

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

  2. सभी भाषाएं समान रूप से समर्थित नहीं हैं, क्योंकि इनमें से कई प्रणालियां एक अपवाद को पकड़ने पर निर्भर हैं और सभी भाषाओं में मजबूत अपवाद नहीं हैं। कहा जा रहा है, सिस्टम के एक महान सौदे के लिए ग्राहक हैं।

  3. उन्हें सुरक्षा जोखिम के रूप में उठाया जा सकता है, क्योंकि इनमें से कई प्रणालियां अनिवार्य रूप से बंद-स्रोत हैं। ऐसे मामलों में, उन पर शोध करने में अपना उचित परिश्रम करें, या यदि पसंद किया जाता है, तो अपना खुद का रोल करें।

  4. वे हमेशा आपको आवश्यक जानकारी नहीं दे सकते हैं। यह दृश्यता को जोड़ने के सभी प्रयासों के साथ एक जोखिम है।

  5. इनमें से अधिकांश सेवाओं को अत्यधिक समवर्ती वेब अनुप्रयोगों के लिए डिज़ाइन किया गया था, इसलिए प्रत्येक उपकरण आपके उपयोग के मामले के लिए एकदम सही नहीं हो सकता है।

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

कुछ अतिरिक्त सुझाव

मैंने उन लोगों द्वारा कोड को ठीक करने की तुलना में अधिक समय बिताया है जो भयानक तरीकों से समवर्ती समस्याओं को हल करने की कोशिश करते हैं। हर बार, मुझे ऐसे मामले मिले हैं, जहां निम्नलिखित चीजें डेवलपर अनुभव को बेहतर कर सकती हैं (जो कि उपयोगकर्ता अनुभव के समान ही महत्वपूर्ण है):

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

    • कोड घटकों के बीच परीक्षण लिंक , न केवल घटक ही। इसे एक पूर्ण विकसित एकीकरण परीक्षण के साथ भ्रमित न करें - जो हर घटक के बीच हर लिंक का परीक्षण करता है, और फिर भी यह केवल अंतिम स्थिति के वैश्विक सत्यापन के लिए दिखता है। यह त्रुटियों को पकड़ने का एक भयानक तरीका है।

एक अच्छा लिंक परीक्षण यह देखने के लिए जांचता है कि क्या, जब एक घटक अलगाव में किसी अन्य घटक से बात करता है , तो प्राप्त संदेश और भेजे गए संदेश वही आ जाते हैं जो आप की अपेक्षा करते हैं। यदि आपके पास दो या दो से अधिक घटक हैं जो साझा करने के लिए एक साझा सेवा पर निर्भर हैं, तो उन सभी को स्पिन करें, उन्हें केंद्रीय सेवा के माध्यम से संदेशों का आदान-प्रदान करें, और देखें कि क्या वे सभी मिल रहे हैं जो आप अंत में उम्मीद करते हैं।

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

  • अपनी एप्लिकेशन स्थिति को मान्य करने के लिए सही एल्गोरिदम का उपयोग करें। मैं साधारण चीजों के बारे में बात कर रहा हूं, जैसे कि जब आपके पास एक मास्टर प्रक्रिया है, जो अपने सभी श्रमिकों को एक काम खत्म करने के लिए इंतजार कर रही है और केवल अगले चरण में जाना चाहते हैं यदि सभी कार्यकर्ता पूरी तरह से काम कर रहे हैं - यह वैश्विक का पता लगाने का एक उदाहरण है समाप्ति, जिसके लिए ज्ञात पद्धतियाँ जैसे कि सफरा का एल्गोरिथ्म मौजूद हैं।

इनमें से कुछ उपकरण भाषाओं के साथ आते हैं - उदाहरण के लिए, आपके कोड की गारंटी के लिए रस्ट का संकलन-समय पर कोई दौड़ की स्थिति नहीं होगी, जबकि गो में एक इनबिल्ट डेडलॉक डिटेक्टर है जो संकलन-समय पर भी चलता है। यदि आप उत्पादन हिट करने से पहले मुद्दों को पकड़ सकते हैं, तो यह हमेशा एक जीत है।

अंगूठे का एक सामान्य नियम: समवर्ती प्रणालियों में विफलता के लिए डिजाइन । यह अनुमान लगाएं कि आम सेवाएं दुर्घटनाग्रस्त होंगी या टूटेंगी। यह उन मशीनों के लिए भी वितरित किया जाता है जो मशीनों में वितरित नहीं होती हैं - एक मशीन पर समवर्ती कोड बाहरी निर्भरता (जैसे एक साझा लॉग फ़ाइल, एक रेडिस सर्वर, एक लानत MySQL सर्वर) पर भरोसा कर सकता है जो किसी भी समय गायब हो सकता है या हटाया जा सकता है। ।

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

आप यह कैसे समझ सकते हैं कि समवर्ती क्या बनाया जा सकता है और क्या अनुक्रमिक बनाया जा सकता है?

मैंने एक उच्च समवर्ती प्रणाली पर काम करना सीखा सबसे बड़ा सबक यह है: आपके पास कभी पर्याप्त मैट्रिक्स नहीं हो सकते । मेट्रिक्स को आपके एप्लिकेशन में पूरी तरह से सब कुछ चलाना चाहिए - यदि आप सब कुछ नहीं माप रहे हैं तो आप इंजीनियर नहीं हैं।

मैट्रिक्स के बिना, आप कुछ बहुत महत्वपूर्ण काम नहीं कर सकते:

  1. प्रणाली में परिवर्तन के द्वारा किए गए अंतर का आकलन करें। यदि आपको नहीं पता कि ट्यूनिंग नॉब ए बना हुआ मीट्रिक बी ऊपर जाता है और मीट्रिक सी नीचे जाता है, तो आप नहीं जानते कि आपके सिस्टम को कैसे ठीक किया जाए जब लोग आपके सिस्टम पर अप्रत्याशित रूप से घातक कोड को धक्का देते हैं (और वे आपके सिस्टम पर कोड को धक्का देंगे) ।

  2. चीजों को बेहतर बनाने के लिए आपको आगे क्या करना है, इसे समझें। जब तक आप जानते हैं कि एप्लिकेशन मेमोरी पर कम चल रहे हैं, आप यह नहीं समझ सकते हैं कि आपको अधिक मेमोरी प्राप्त करनी चाहिए या अपने सर्वर के लिए अधिक डिस्क खरीदना चाहिए।

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

कहा जा रहा है कि, निश्चित रूप से अंगूठे के कुछ नियम हैं:

  1. अनुक्रमिक निर्भरता का तात्पर्य है। दो प्रक्रियाएँ अनुक्रमिक होनी चाहिए अगर एक कुछ फैशन में दूसरे पर निर्भर है। बिना निर्भरता वाली प्रक्रियाएं समवर्ती होनी चाहिए। हालाँकि, विफलता को स्ट्रीम को संभालने का एक तरीका है जो प्रक्रियाओं को अनिश्चित काल तक प्रतीक्षा करने से नहीं रोकता है।

  2. एक ही कोर पर सीपीयू-बाउंड कार्य के साथ I / O बाध्य कार्य को कभी न मिलाएं। न करें (उदाहरण के लिए) एक वेब क्रॉलर लिखें जो एक ही धागे में दस समवर्ती अनुरोधों को लॉन्च करता है, जैसे ही वे आते हैं, उन्हें स्क्रैप करते हैं, और पांच सौ के पैमाने की उम्मीद करते हैं - I / O अनुरोध समानांतर में एक कतार में जाते हैं, लेकिन सीपीयू अभी भी क्रमिक रूप से उनके माध्यम से जाएगा। (यह सिंगल-थ्रेडेड इवेंट संचालित मॉडल एक लोकप्रिय है, लेकिन यह इस पहलू के कारण सीमित है - यह समझने के बजाय, लोग बस अपने हाथों को कुल्ला करते हैं और कहते हैं कि नोड आपको पैमाने नहीं देता है, आपको एक उदाहरण देने के लिए)।

एक एकल धागा बहुत सारे I / O काम कर सकता है। लेकिन अपने हार्डवेयर की संगति का पूरी तरह से उपयोग करने के लिए, सभी कोर पर कब्जा करने वाले थ्रेडपूल का उपयोग करें। ऊपर दिए गए उदाहरण में, केवल पाँच कार्य (छह-कोर मशीन पर एक कोर का उपयोग कर सकते हैं) को लॉन्च करने के लिए केवल CPU काम और I / O के लिए एक छठे पायथन धागे को लॉन्च करना आपके विचार से बहुत तेज़ होगा।

सीपीयू संगणना का लाभ उठाने का एकमात्र तरीका एक समर्पित थ्रेडपूल है। एक एकल धागा अक्सर I / O बाध्य कार्य के लिए पर्याप्त होता है। यही कारण है कि इवेंट-चालित वेब सर्वर जैसे कि नग्नेक्स स्केल बेहतर है (वे विशुद्ध रूप से I / O बाध्य कार्य करते हैं) Apache की तुलना में (जो सीपीयू की आवश्यकता वाले किसी चीज के साथ I / O बाध्य कार्य को स्वीकार करता है और अनुरोध के अनुसार एक प्रक्रिया शुरू करता है), लेकिन क्यों Node का उपयोग करने के लिए समानांतर में प्राप्त हज़ारों GPU गणना एक भयानक विचार है।


0

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

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


0

आप कैसे पता लगा सकते हैं कि समवर्ती क्या बनाया जा सकता है बनाम क्या अनुक्रमिक होना चाहिए?

बहुत ज्यादा हर एक चीज जिसे आप लिखते हैं, विशेष रूप से संगामिति का लाभ उठा सकते हैं "विशेष रूप से" एक विजेता को जीतें "उपयोग मामला। एक बेहतर सवाल यह है कि समवर्ती क्या होना चाहिए?

यूसुफ अलबहारी की सी # सूची में थ्रेडिंग पाँच सामान्य उपयोग हैं।

मल्टीथ्रेडिंग के कई उपयोग हैं; यहाँ सबसे आम हैं:

उत्तरदायी उपयोगकर्ता इंटरफ़ेस बनाए रखना

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

अन्यथा अवरुद्ध सीपीयू का कुशल उपयोग करना

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

समानांतर प्रोग्रामिंग

कोड जो गहन गणना करता है, मल्टीकोर या मल्टीप्रोसेसर कंप्यूटर पर तेजी से निष्पादित कर सकता है यदि कार्यभार को "विभाजन और जीत" रणनीति में कई थ्रेड्स के बीच साझा किया जाता है (भाग 5 देखें)।

सट्टा निष्पादन

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

अनुमति अनुरोधों को एक साथ संसाधित किया जाना है

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

यदि आप उपरोक्त में से एक करने की कोशिश नहीं कर रहे हैं, तो आप इसके बारे में वास्तविक रूप से बेहतर सोचना चाहेंगे।

आप त्रुटि की स्थिति को कैसे पुन: उत्पन्न करते हैं और देखते हैं कि आवेदन निष्पादित होने के समय क्या हो रहा है?

यदि आप .NET का उपयोग कर रहे हैं और आपने उपयोग किए गए मामलों को लिखा है तो आप CHESS का उपयोग कर सकते हैं जो विशिष्ट थ्रेड इंटरलेविंग शर्तों को फिर से बना सकता है जो आपको अपने फिक्स का परीक्षण करने में सक्षम बनाता है।

आप आवेदन के विभिन्न समवर्ती भागों के बीच बातचीत की कल्पना कैसे करते हैं?

ये संदर्भ पर निर्भर करता है। कार्यकर्ता परिदृश्यों के लिए मुझे लगता है कि एक प्रबंधक-अधीनस्थ है। मांगर अधीनस्थ को कुछ करने के लिए कहता है और स्थिति अपडेट का इंतजार करता है।

समवर्ती असंबंधित कार्यों के लिए मैं यातायात के अलग लेन में लिफ्ट या कारों के बारे में सोचता हूं।

सिंक्रनाइज़ेशन के लिए मैं कभी-कभी ट्रैफिक लाइट या टर्न-स्टाइल के बारे में सोचता हूं।

यदि आप C # 4.0 का उपयोग कर रहे हैं, तो आप टास्क समानांतर लाइब्रेरी पर एक नज़र डालना चाहते हैं


0

इस सवाल के लिए मेरा जवाब है:

  • आप कैसे पता लगा सकते हैं कि समवर्ती क्या बनाया जा सकता है बनाम क्या अनुक्रमिक होना चाहिए?

पहले मुझे यह जानने की आवश्यकता है कि मुझे संगामिति का उपयोग क्यों करना चाहिए, क्योंकि मुझे पता चला है कि लोग संगामिति के पीछे विचार के साथ बाहर निकलते हैं, लेकिन हमेशा उस समस्या के बारे में नहीं सोचते हैं जिसे वे हल करने की कोशिश कर रहे हैं।

यदि आपको वास्तविक जीवन की स्थिति जैसे कतारों, वर्कफ़्लो आदि का अनुकरण करना है, तो आपको सबसे अधिक समवर्ती दृष्टिकोण का उपयोग करने की आवश्यकता होगी।

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

  • आप त्रुटि की स्थिति को कैसे पुन: उत्पन्न करते हैं और देखते हैं कि आवेदन निष्पादित होने के समय क्या हो रहा है?

मैं इस मामले का कोई विशेषज्ञ नहीं हूं लेकिन मुझे लगता है कि समवर्ती प्रणालियों के लिए यह सही दृष्टिकोण नहीं है। एक सैद्धांतिक दृष्टिकोण चुना जाना चाहिए, महत्वपूर्ण क्षेत्रों पर 4 गतिरोध आवश्यकताओं की तलाश में:

  1. गैर preemptiveness
  2. रुको और रुको
  3. प्रेरक बहिष्कार
  4. परिपत्र श्रृंखला

    • आप आवेदन के विभिन्न समवर्ती भागों के बीच बातचीत की कल्पना कैसे करते हैं?

मैं पहले यह पहचानने की कोशिश करता हूं कि बातचीत में भाग लेने वाले कौन हैं, फिर वे कैसे और किसके साथ संवाद करते हैं। अंत में, ग्राफ़ और इंटरैक्शन आरेख मुझे कल्पना करने में मदद करते हैं। मेरे अच्छे पुराने व्हाइटबोर्ड को किसी अन्य प्रकार के मीडिया द्वारा पीटा नहीं जा सकता है।


0

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

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

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

एक अच्छा नियम है जहाँ आप कभी भी चौखटे का उपयोग कर सकते हैं। यदि आप मूल थ्रेडिंग घटक स्वयं लिख रहे हैं, जैसे कि अच्छी सिंक्रनाइज़ डेटा संरचनाएँ, या ईश्वर-मना, वास्तविक सिंक्रो-प्राइमिटीज़, तो आप निश्चित रूप से अपने पूरे पैर को उड़ाने जा रहे हैं।

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

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

सारांश में:
शुरू:
सोचो
टॉक
टेस्ट
लिखें बस
पढ़ें
टेस्ट
लिखें
डीबग
गोटो शुरू

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