Node.js को हास्केल प्रतिक्रिया क्या है?


217

मेरा मानना ​​है कि एरलांग समुदाय नोडे.जेएस से ईर्ष्या नहीं करता है, क्योंकि यह आई / ओ को मूल रूप से अवरुद्ध करता है और एक से अधिक प्रोसेसर के लिए आसानी से तैनाती का पैमाना है (कुछ भी नहीं जो कि नोड-जेएस में बिल्ट-इन नहीं है)। Http://journal.dedasys.com/2010/04/29/erlang-vs-node-js और Node.js या Erlang पर अधिक जानकारी

हास्केल के बारे में क्या? क्या Haskell Node.js के कुछ लाभ प्रदान कर सकता है, अर्थात् I / O को मल्टी-थ्रेड प्रोग्रामिंग की सहायता के बिना अवरुद्ध करने से बचने के लिए एक स्वच्छ समाधान?


कई चीजें हैं जो Node.js के साथ आकर्षक हैं

  1. घटनाएँ: कोई धागा हेरफेर नहीं, प्रोग्रामर केवल कॉलबैक प्रदान करता है (स्नैप फ्रेमवर्क के अनुसार)
  2. कॉलबैक को एक ही धागे में चलाने की गारंटी दी जाती है: कोई भी दौड़ की स्थिति संभव नहीं है।
  3. अच्छा और सरल यूनिक्स-अनुकूल एपीआई। बोनस: उत्कृष्ट HTTP समर्थन। डीएनएस भी उपलब्ध है।
  4. हर I / O डिफ़ॉल्ट अतुल्यकालिक है। इससे ताले से बचना आसान हो जाता है। हालांकि, एक कॉलबैक में बहुत अधिक सीपीयू प्रसंस्करण अन्य कनेक्शनों को प्रभावित करेगा (इस मामले में, कार्य को छोटे उप-कार्यों में विभाजित करना चाहिए और पुन: अनुसूचित होना चाहिए)।
  5. क्लाइंट-साइड और सर्वर-साइड के लिए समान भाषा। (हालांकि, इस एक में मुझे बहुत अधिक मूल्य नहीं दिखता है। jQuery और Node.js ईवेंट प्रोग्रामिंग मॉडल साझा करते हैं, लेकिन बाकी बहुत अलग है। मैं बस यह नहीं देख सकता कि सर्वर-साइड और क्लाइंट-साइड के बीच कोड साझा करना कैसे संभव है। व्यवहार में उपयोगी हो।)
  6. यह सब एक उत्पाद में पैक किया गया।

17
मुझे लगता है कि आपको इसके बजाय प्रोग्रामर पर यह सवाल पूछना चाहिए ।
जोनास 18

47
कोड का एक टुकड़ा शामिल नहीं है यह एक व्यक्तिपरक सवाल नहीं है।
19

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

9
@gawi मुझे नहीं लगता है कि कार्यक्रम के लिए बहुत आसान लगता है - पूर्व भुगतान के बिना, आपको भुखमरी और लंबे समय तक विलंब की संभावना से निपटना होगा। मूल रूप से थ्रेड्स एक वेब सर्वर के लिए सही अमूर्तता हैं - अतुल्यकालिक I / O से निपटने की कोई आवश्यकता नहीं है और इसके साथ जाने वाली सभी कठिनाइयाँ, बस एक थ्रेड में करें। संयोग से, मैंने हास्केल में वेब सर्वरों के बारे में एक पेपर लिखा था जो आपको दिलचस्प लग सकता है: haskell.org/~simonmar/papers/web-server-jfp.pdf
साइमन मार्लो

3
"कॉलबैक को एक ही धागे में चलाने की गारंटी है: कोई दौड़ की स्थिति संभव नहीं है।" गलत। आप आसानी से Node.js में दौड़ की स्थिति पा सकते हैं; बस यह मान लें कि एक I / O क्रिया एक दूसरे से पहले पूरी हो जाएगी, और BOOM। क्या है वास्तव में असंभव दौड़ शर्तों में से एक विशेष प्रकार, स्मृति में एक ही बाइट के लिए अर्थात् समवर्ती unsynchronised उपयोग है।
12

जवाबों:


219

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

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

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

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


42
ठीक है, इसलिए मुझे लगता है कि नोड.जेएस 2 समस्याओं का समाधान है: 1- संगामिति ज्यादातर भाषाओं में कठिन है, 2- ओएस थ्रेड्स का उपयोग विस्तार है। Node.js समाधान थ्रेड्स के बीच संचार से बचने और OS थ्रेड्स की स्केलेबिलिटी समस्याओं से बचने के लिए ईवेंट-आधारित कंसीडर (w / libev) का उपयोग करना है। शुद्धता के कारण हास्केल को # 1 समस्या नहीं है। # 2 के लिए, हास्केल के पास हल्के धागे + इवेंट मैनेजर हैं जिन्हें हाल ही में बड़े पैमाने पर संदर्भों के लिए जीएचसी में अनुकूलित किया गया था। इसके अलावा, जावास्क्रिप्ट का उपयोग करना किसी भी हास्केल डेवलपर के लिए प्लस के रूप में नहीं माना जा सकता है। स्नैप फ्रेमवर्क का उपयोग करने वाले कुछ लोगों के लिए, Node.js "बस बुरा" है।
गावी

4
अनुरोध प्रसंस्करण अधिकांश समय अंतर-निर्भर संचालन का एक क्रम है। मैं इस बात से सहमत हूं कि हर ब्लॉकिंग ऑपरेशन के लिए कॉलबैक का उपयोग करना बोझिल हो सकता है। इसके लिए कॉलबैक से थ्रेड बेहतर अनुकूल हैं।
गावी

10
हां! और GHC 7 में बिलकुल नया I / O मल्टीप्लेक्सिंग हास्केल में राइटिंग सर्वर को और बेहतर बनाता है।
andreypopp

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

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

154

क्या Haskell Node.js के कुछ लाभ प्रदान कर सकता है, अर्थात् I / O को मल्टी-थ्रेड प्रोग्रामिंग की सहायता के बिना अवरुद्ध करने से बचने के लिए एक स्वच्छ समाधान?

हां, वास्तव में हस्केल में घटनाओं और धागों का एकीकरण होता है।

  • आप स्पष्ट हल्के धागों में कार्यक्रम कर सकते हैं (जैसे एक लैपटॉप पर लाखों धागे)।
  • या; आप स्केलेबल इवेंट सूचना के आधार पर एक एसिंक्स इवेंट-चालित शैली में प्रोग्राम कर सकते हैं।

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

जैसे के लिए

32 कोर पर समवर्ती संग्रह nbody

वैकल्पिक शब्द

हास्केल में आपके पास घटनाएँ और धागे दोनों हैं, और जैसा कि यह सभी घटनाएँ हैं।

कार्यान्वयन का वर्णन करने वाला पेपर पढ़ें


2
धन्यवाद। मुझे यह सब पचाने की जरूरत है ... यह जीएचसी-विशिष्ट प्रतीत होता है। मुझे लगता है कि यह ठीक है। हास्केल भाषा कुछ समय है क्योंकि कुछ भी जीएचसी संकलन कर सकता है। एक समान तरीके से, हास्केल "प्लेटफॉर्म" कम या ज्यादा जीएचसी रन-टाइम है।
गावी

1
@gawi: वह और अन्य सभी पैकेज जो सही में बंडल किए गए हैं ताकि यह बॉक्स से बाहर उपयोगी हो। और यह वही छवि है जो मैंने अपने सीएस कोर्स में देखी थी; और सबसे अच्छी बात यह है कि हास्केल में अपने स्वयं के कार्यक्रमों में समान भयानक परिणाम प्राप्त करना कठिन नहीं है।
रॉबर्ट मासैओली

1
हाय डॉन, क्या आपको लगता है कि आप हैसेल वेब सर्वर से लिंक कर सकते हैं जो इन जैसे सवालों का जवाब देते समय सबसे अच्छा (ताना) करता है? यहाँ Node.js के विरुद्ध काफी प्रासंगिक बेंचमार्क है: Yesodweb.com/blog/2011/03/…
ग्रेग वेबर

4
बस सिद्धांत में। हास्केल "हल्के धागे" इतने हल्के नहीं हैं जितना आप सोचते हैं। यह एक तथाकथित हरे धागे को शेड्यूल करने की तुलना में एक एपोल इंटरफ़ेस पर कॉलबैक रजिस्टर करने के लिए बहुत अधिक सस्ता है, वे निश्चित रूप से ओएस थ्रेड्स की तुलना में सस्ते हैं, लेकिन वे स्वतंत्र नहीं हैं। उनमें से 100.000 बनाना लगभग उपयोग करता है। 350 एमबी मेमोरी और कुछ समय लें। नोड के साथ 100.000 कनेक्शन आज़माएं ।js. बिल्कुल भी परेशानी नहीं है । यह जादू होगा यदि यह तेजी से नहीं होता क्योंकि ghc हुड के नीचे epoll का उपयोग करता है, इसलिए वे सीधे epoll का उपयोग करने की तुलना में तेज़ नहीं हो सकते। थ्रेड इंटरफ़ेस के साथ प्रोग्रामिंग काफी अच्छा है, हालांकि।
Kr0e

3
इसके अलावा: नया IO प्रबंधक (ghc) शेड्यूलिंग एल्गोरिथ्म का उपयोग करता है जिसमें (m log n) जटिलता है (जहाँ m रन करने योग्य थ्रेड्स की संख्या है और n थ्रेड्स की कुल संख्या)। एपोल में जटिलता k (k पठनीय / लिखने योग्य fd = की संख्या है। इसलिए ghc में सभी जटिलता पर O (k * m log n) है जो उच्च यातायात कनेक्शन का सामना करने पर बहुत अच्छा नहीं है। Node.js सिर्फ रैखिक जटिलता के कारण हैं। epoll द्वारा। और बस हमें विंडोज़ के प्रदर्शन के बारे में बात नहीं करनी चाहिए ... Node.js बहुत तेज़ है क्योंकि यह IOCP का उपयोग करता है।
Kr0e

20

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

घटनाएँ: कोई धागा हेरफेर नहीं, प्रोग्रामर केवल कॉलबैक प्रदान करता है (स्नैप फ्रेमवर्क के अनुसार)

तो इसे ध्यान में रखते हुए, यदि आप चाहें, तो आप एक अतुल्यकालिक शैली का उपयोग करके लिख सकते हैं, लेकिन ऐसा करने से आप एक कुशल सिंक्रोनस शैली में लिख सकते हैं, जिसमें अनुरोध प्रति एक धागा है। हास्केल संयुक्ताक्षर कोड में ल्युडेरिकली कुशल है, खासकर जब अन्य भाषाओं की तुलना में। यह सभी घटनाओं के नीचे है।

कॉलबैक को एक ही धागे में चलाने की गारंटी दी जाती है: कोई भी दौड़ की स्थिति संभव नहीं है।

आप अभी भी नोड.जेएस में एक दौड़ की स्थिति रख सकते हैं, लेकिन यह अधिक कठिन है।

हर अनुरोध इसमें स्वयं का है। जब आप ऐसा कोड लिखते हैं जिसमें अन्य थ्रेड्स के साथ संवाद करना होता है, तो हैक्सेल की समसामयिकता के लिए थ्रेडसेफ़ को धन्यवाद देना बहुत आसान है।

अच्छा और सरल यूनिक्स-अनुकूल एपीआई। बोनस: उत्कृष्ट HTTP समर्थन। डीएनएस भी उपलब्ध है।

हैकेज में देखिए और खुद देखिए।

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

आपको ऐसी कोई समस्या नहीं है, ghc आपके काम को वास्तविक OS थ्रेड के बीच वितरित करेगा।

क्लाइंट-साइड और सर्वर-साइड के लिए समान भाषा। (हालांकि, मैं इस एक में बहुत अधिक मूल्य नहीं देखता हूं। JQuery और Node.js ईवेंट प्रोग्रामिंग मॉडल साझा करते हैं, लेकिन बाकी बहुत अलग है। मैं बस यह नहीं देख सकता कि सर्वर-साइड और क्लाइंट-साइड के बीच कोड साझा करना कैसे संभव है। व्यवहार में उपयोगी हो।)

हास्केल संभवतः यहाँ जीत नहीं सकता ... ठीक है? फिर से सोचें, http://www.haskell.org/haskellwiki/Haskell_in_web_browser

यह सब एक उत्पाद में पैक किया गया।

डाउनलोड ghc, आग ऊपर cabal। हर जरूरत के लिए एक पैकेज है।


मैं सिर्फ शैतान के वकील की भूमिका निभा रहा था। तो, हाँ मैं आपकी बातों पर सहमत हूं। क्लाइंट-साइड और सर्वर-साइड भाषा एकीकरण को छोड़कर। जबकि मुझे लगता है कि यह तकनीकी रूप से संभव है, मुझे नहीं लगता कि यह अंततः सभी जावास्क्रिप्ट पारिस्थितिकी तंत्र को आज (JQuery और दोस्तों) में बदल सकता है। हालांकि यह एक तर्क है जो Node.js समर्थकों द्वारा आगे रखा गया है, मुझे नहीं लगता कि यह बहुत महत्वपूर्ण है। क्या आपको वास्तव में अपनी प्रस्तुति परत और अपने बैकएंड के बीच उस कोड को साझा करने की आवश्यकता है? क्या हम वास्तव में केवल एक भाषा जानने वाले प्रोग्रामर होने का लक्ष्य रखते हैं?
गावी

असली जीत यह है कि आप सर्वर और क्लाइंट दोनों तरफ के पृष्ठों को वास्तविक समय के पेज बनाने के लिए आसान बना सकते हैं।
dan_waterworth

@dan_waterworth बिल्कुल, उल्का या derby.js
mb21

1
@gawi हमारे पास उत्पादन सेवाएँ हैं जहाँ 85% कोड क्लाइंट और सर्वर के बीच साझा किया जाता है। इसे समुदाय में सार्वभौमिक जावास्क्रिप्ट के रूप में जाना जाता है। हम क्लाइंट पर पहले उपयोगी रेंडर के लिए समय कम करने के लिए सर्वर पर सामग्री को गतिशील रूप से प्रस्तुत करने के लिए प्रतिक्रिया का उपयोग कर रहे हैं। जब मुझे पता है कि आप ब्राउज़र में हास्केल चला सकते हैं, तो मुझे "यूनिवर्सल हास्केल" सर्वोत्तम प्रथाओं के किसी भी सेट के बारे में पता नहीं है जो सर्वर-साइड और क्लाइंट-साइड रेंडरिंग के लिए एक ही कोडबेस का उपयोग करने की अनुमति देता है।
एरिक इलियट

8

मैं व्यक्तिगत रूप से Node.js और कॉलबैक के साथ प्रोग्रामिंग को अनावश्यक रूप से निम्न-स्तर और थोड़ी अप्राकृतिक चीज़ के रूप में देखता हूं। जब एक अच्छा क्रम जैसे कि जीएचसी में पाया जाता है तो कॉलबैक के साथ प्रोग्राम आपके लिए कॉलबैक को कैसे संभाल सकता है और इतनी कुशलता से कर सकता है?

इस बीच, GHC रनटाइम में बहुत सुधार हुआ है: इसमें अब MIO नामक एक "नया नया IO प्रबंधक" शामिल है जहाँ "M" का अर्थ है मल्टीकोर मैं मानता हूँ। यह मौजूदा IO प्रबंधक की नींव पर बनाता है और इसका मुख्य लक्ष्य 4+ कोर प्रदर्शन गिरावट के कारण को दूर करना है। इस पत्र में प्रदत्त प्रदर्शन संख्याएँ बहुत प्रभावशाली हैं। खुद को देखो:

Mio के साथ, 20 सीपीयू कोर के लिए हास्केल स्केल में यथार्थवादी HTTP सर्वर, GHC के पिछले संस्करणों का उपयोग करके समान सर्वर की तुलना में 6.5x तक के पीक प्रदर्शन को प्राप्त करता है। हास्केल सर्वरों की विलंबता में भी सुधार हुआ है: [...] एक मध्यम भार के तहत, GHC के पिछले संस्करणों की तुलना में 5.7x तक अपेक्षित प्रतिक्रिया समय को कम करता है।

तथा:

हम यह भी दिखाते हैं कि Mio के साथ, McNettle (Haskell में लिखा एक SDN कंट्रोलर) प्रभावी रूप से 40+ कोर तक स्केल कर सकता है, एक मशीन पर प्रति सेकंड 20 मिलियन से अधिक नए अनुरोधों के विवाद तक पहुंच सकता है, और इसलिए सभी मौजूदा SDN नियंत्रकों में सबसे तेज़ हो सकता है ।

Mio ने इसे GHC 7.8.1 रिलीज़ में बनाया है। मैं व्यक्तिगत रूप से इसे हास्केल प्रदर्शन में एक प्रमुख कदम के रूप में देखता हूं। पिछले जीएचसी संस्करण और 7.8.1 द्वारा संकलित मौजूदा वेब अनुप्रयोगों के प्रदर्शन की तुलना करना बहुत दिलचस्प होगा।


6

IMHO इवेंट अच्छे हैं, लेकिन कॉलबैक के माध्यम से प्रोग्रामिंग नहीं है।

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

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

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


डेटाबेस के लिए async I / O को संभालने के लिए नोड.जेएस कॉलबैक का उपयोग किया जाता है। आप कुछ अलग के बारे में बात कर रहे हैं, जबकि दिलचस्प है, इस सवाल का जवाब नहीं है।
रॉबिन ग्रीन

तुम सही हो। इसका उत्तर देने में तीन साल लग गए, मुझे आशा है कि, आपकी आपत्तियों को पूरा करेगा: github.com/transient-haskell
agocorona

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

5

प्रश्न बहुत हास्यास्पद है क्योंकि 1) हास्केल ने पहले से ही इस मुद्दे को बहुत बेहतर तरीके से हल किया है और 2) लगभग उसी तरह से है जैसा कि एरलांग ने किया है। यहाँ नोड के खिलाफ बेंचमार्क है: http://www.yesodweb.com/blog/2011/03/preliminary-warp-cross-language-benchmark

हास्केल 4 कोर दें और यह एक आवेदन में प्रति सेकंड 100k (सरल) अनुरोध कर सकता है। नोड के रूप में कई नहीं कर सकते, और कोर के पार एक भी आवेदन नहीं कर सकते। और आपको इसे पुनः प्राप्त करने के लिए कुछ भी करने की ज़रूरत नहीं है क्योंकि हास्केल रनटाइम नॉन-ब्लॉकिंग है। केवल दूसरी (अपेक्षाकृत आम) भाषा जिसमें गैर-अवरोधक IO को रनटाइम में बनाया गया है, वह है एरलांग।


14
हास्यास्पद? सवाल यह नहीं है "क्या हास्केल की प्रतिक्रिया है" बल्कि "हास्केल की प्रतिक्रिया क्या है"। जिस समय यह प्रश्न पूछा गया था, जीएचसी 7 को भी जारी नहीं किया गया था इसलिए हास्केल अभी तक "खेल में" नहीं थे (शायद स्नैप की तरह कामेच्छा का उपयोग करने वाले ढांचे को छोड़कर)। इसके अलावा, मैं सहमत हूं।
गवी

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

2
4 से अधिक कोर का उपयोग करने वाला हास्केल आवेदन के प्रदर्शन को नीचा दिखाता है। इस मुद्दे पर एक पेपर था, यह सक्रिय रूप से काम कर रहा है लेकिन यह अभी भी एक मुद्दा है। तो 16 कोर सर्वर पर Node.js के 16 इंस्टेंस को चलाने के लिए + आरटीएस-एन 16 का उपयोग करते हुए एकल ghc एप्लिकेशन की तुलना में बहुत बेहतर होगा जो वास्तव में इस रनटाइम बग की वजह से + आरटीएस-एन 1 की तुलना में धीमा होगा। ऐसा इसलिए है क्योंकि वे सिर्फ एक IOManager का उपयोग करते हैं जो कई OS थ्रेड्स के साथ उपयोग करने पर धीमा हो जाएगा। मुझे आशा है कि वे इस बग को ठीक कर देंगे, लेकिन यह तब से मौजूद है, तो मुझे बहुत उम्मीद नहीं होगी ...
Kr0e

इस उत्तर को देखने वाला कोई भी व्यक्ति इस बात से अवगत होना चाहिए कि नोड एक कोर पर 100k सरल अनुरोधों को आसानी से संसाधित कर सकता है और कई कोर के पार एक स्टेटलेस नोड एप्लीकेशन को लागू करना बहुत आसान है। pm2 -i max path/to/app.jsस्वचालित रूप से उपलब्ध कोर के आधार पर उदाहरणों की अधिकतम संख्या को मापेगा। इसके अतिरिक्त, नोड भी डिफ़ॉल्ट रूप से गैर-अवरुद्ध है।
एरिक इलियट

1

1
यह प्रश्न का उत्तर कैसे देता है?
dfeuer

1
@dfeuer लिंक के रूप में पढ़ा जाना चाहिए, स्नैप हास्केल वेब फ्रेमवर्क ने कामवासना को गिरा दिया है, मुझे नहीं पता कि स्वरूपण विफल क्यों हो रहा है। नोड सर्वर रनटाइम के शुरू होने के समय यह सब लिनक्स के काम के बारे में था, और इसलिए स्नैप वेब फ्रेमवर्क था। स्नैप के साथ हास्केल नोड्ज के साथ ईसीएमएस्क्रिप्ट के समान है, इसलिए नोड के साथ स्नैप कैसे विकसित होता है नोडस्क, हास्केल की तुलना में अधिक प्रासंगिक है, इस संदर्भ में ईसीएमएस्क्रिप्ट के साथ तुलना में अधिक सही हो सकता है।
चवठे विपुल एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.