2009-12-18 18 views
7

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

ऐसे क्षेत्र हैं जहां वे अन्य की तुलना में मजबूत कर रहे हैं और क्षेत्रों वे गिर जाता है क्या कर रहे हैं क्या हैं?

+6

एक भाषा असीमित कैसे हो सकती है? –

+0

@NSD - उसका क्या मतलब है कि फ्लेक्स कभी भी अवरुद्ध नहीं होता - सभी प्लेटफॉर्म पर अवरुद्ध होने वाले सभी ऑपरेशन असंगत रूप से कार्यान्वित किए जाते हैं। – Grokys

+3

क्या आपके पास "सिंक्रोनस निष्पादन भाषा" की परिभाषा है? या क्या आप बस फ्लेक्स की घटना-संचालित प्रकृति की व्याख्या कर रहे हैं (जो जावा के समेत लगभग हर दूसरे जीयूआई एपीआई में भी पाया जाता है) "एसिंक्रोनस" के रूप में? – kdgregory

उत्तर

6

मैं Silverlight में पिछले साल कोडिंग, जो मैं समय की एक अच्छा सौदा के माध्यम से सोच (और साथ लड़) एक ही मुद्दों आप का वर्णन कर रहे हैं खर्च किया है इसका मतलब है की सबसे अधिक खर्च किया है।

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

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

(और हाँ, अन्य लोगों का कहना है कि यह भाषा अतुल्यकालिक इतना है कि के रूप में है कि विशेष व्यवस्थाएं एक अतुल्यकालिक तरीके से अपने कोड के निर्माण की आवश्यकता नहीं है में सही कर रहे हैं -। लेकिन मैं तुम क्या मतलब मिल)

अद्यतन 2014.09.23 -

मैंने ऊपर दिए गए उत्तर को लिखने के बाद से कई प्रकार के एसिंक्रोनस फ्रेमवर्क के साथ बहुत अधिक काम किया है (जैसा कि शायद हर कोई है जिसने कोई वेब कोडिंग किया है), और सोचा कि मैं कुछ जोड़ूंगा अतिरिक्त यादृच्छिक नोट्स:

  • यदि आप सी # या एफ # जैसी भाषा का उपयोग कर रहे हैं जिसमें प्रथम श्रेणी के असीमित समर्थन है, तो कम से कम एक बार जब आप अपने सिर को अजीब async/await पैटर्न के चारों ओर लपेटते हैं, तो यह बहुत आसान हो जाता है। एसिंक्रोनस कॉल के आस-पास आसानी से लूप करने में सक्षम होने के कारण, और पूरी चीज को सरल try/catch से लपेटें, अगर आपको इसे पुराने तरीके से करना पड़ा तो आश्चर्यजनक है।

  • आप प्रथम श्रेणी async समर्थन के साथ एक भाषा का प्रयोग नहीं कर रहे हैं, जो कुछ भी promise या future या task समर्थन का उपयोग शुरू कर उस भाषा प्रदान करता है (जैसे, JQuery के $.Deferred(), या कोणीय के $q.defer()। उन एक बहुत क्लीनर कर रहे हैं और कॉलबैक के साथ आम तौर पर आपको जो मिलता है उससे बेहतर संरचना प्रदान करें।

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

+0

क्या ईवेंट संचालित ढांचे में अनुप्रयोग लिखने के लिए कोई अभ्यास है? – Umesh

+0

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

3

ए 'रूपरेखा "एक" भाषा "(जो कुछ भी है) पर बनाया गया इस तरह के मामलों को संभालने के लिए सक्षम होना चाहिए (अर्थ विज्ञान स्तर चर्चा यानी" सिंक/async भाषा "एक तरफ छोड़कर) (सिंक/async कार्यक्रम प्रवाह) उपयोगी होने के लिए (पढ़ें: $ बुद्धिमान)।

अतुल्यकालिक मुहावरों हर स्तर पर उपयुक्त हैं।

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

यहां तक ​​कि एक छोटे पैमाने पर (जैसे जीयूआई आवेदन), घटनाएं (जैसे "माउस क्लिक ")" एसिंक्रोनस "होते हैं। बेशक वे किसी बिंदु पर "क्रमबद्ध" होते हैं (कुछ सॉफ़्टवेयर चलाने वाले किसी एप्लिकेशन द्वारा संसाधित होने के लिए) लेकिन यह इस तथ्य को नहीं बदलेगा कि कार्यक्रम (संभवतः) प्रोग्राम के प्रवाह के संबंध में "असीमित रूप से" हुआ सवाल।

+0

द्वारा एसिंक शैली को बल दें यदि आप समानांतर में एकाधिक परीक्षण केस सोचते हैं। लेकिन जहां तक ​​मैं सोच सकता हूं, वे केवल परीक्षण मामलों में मदद करेंगे। वास्तविक जीवन में और सभी "अगला क्या" पूरी तरह से "अब क्या हो रहा है" या उसके परिणाम पर निर्भर करता है। तो एसिंक्रोनस एक उपलब्धि कैसे बन सकता है? – Umesh

+1

@ उमेश: "अब क्या हो रहा है" एक "सैंडबॉक्स" है जो कृत्रिम रूप से "क्रमबद्धता" घटनाओं द्वारा बनाया गया है। यह "संदर्भ फ्रेम" का एक प्रश्न है (जैसा कि हम इसे भौतिकी में बुलाएंगे)।"एसिंक्रोनस एक उपलब्धि कैसे बन सकता है" के लिए, मुझे कहना होगा कि मैं आपका अनुसरण नहीं कर रहा हूं। क्या आप कृपया समझाने की देखभाल करेंगे? – jldupont

+0

आपकी व्याख्या ने मुझे स्पष्ट कर दिया। कृपया मेरा प्रश्न भूल जाओ। धन्यवाद – Umesh

1

मुझे लगता है कि यह भाषा के बारे में नहीं है, बल्कि ढांचे के बारे में है।

बिंदु में काउंटर केस:

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

+0

क्या यह वास्तव में समानांतर चीजों को चलाने और हार्डवेयर का उपयोग करके प्रदर्शन सुधार का मतलब है । लेकिन पैरेंट थ्रेड से कॉलबैक सुनने की लागत क्या है। क्या उनके पास बेहतर पक्ष है? – Umesh

+0

@ उमेश: आप किसी अन्य थ्रेड से कॉलबैक नहीं सुनते हैं, थ्रेड सीधे कॉलबैक को कॉल करता है। ओवरहेड किसी अन्य फ़ंक्शन कॉल के समान होता है। – tloach

संबंधित मुद्दे