बहु-थ्रेडेड जावास्क्रिप्ट रनटाइम कार्यान्वयन बनाने की कमियां क्या हैं? [बन्द है]


51

मैं पिछले सप्ताह के लिए एक बहु-थ्रेडेड जावास्क्रिप्ट रनटाइम कार्यान्वयन पर काम कर रहा हूं। मेरे पास जावास्क्रिप्ट और बढ़ावा देने के लिए C ++ में बनाई गई अवधारणा का प्रमाण है।

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

वर्किंग मल्टीथ्रेडेड नोड.जेएस रनटाइम

समस्या यह है कि जब मैं इस डिज़ाइन को जावास्क्रिप्ट प्रोग्रामर को दिखाता हूं तो मुझे बेहद नकारात्मक प्रतिक्रिया मिलती है, और मुझे पता नहीं क्यों। निजी तौर पर भी, वे सभी कहते हैं कि जावास्क्रिप्ट को एकल पिरोया जाना है, जिसे मौजूदा पुस्तकालयों को फिर से लिखना होगा, और यह कि gremlins स्पॉन करेंगे और हर जीवित प्राणी को खाएंगे यदि मैं इस पर काम करना जारी रखता हूं।

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

तुम क्या सोचते हो? क्या जावास्क्रिप्ट का अर्थ है एकल पिरोया जाना, और क्या इसे अकेला छोड़ दिया जाना चाहिए? समवर्ती जावास्क्रिप्ट रनटाइम के विचार के खिलाफ हर कोई क्यों है?

संपादित करें: परियोजना अब GitHub पर है , इसे स्वयं प्रयोग करें और मुझे बताएं कि आप क्या सोचते हैं।

निम्नलिखित सभी सीपीयू कोर पर वादे की एक तस्वीर है जिसमें कोई विवाद नहीं है:

चल रहे वादे समवर्ती।


7
यह एक उच्च विचार वाला प्रश्न लगता है। क्या आपने उन लोगों से पूछा, जो आपके विचार को स्पष्ट रूप से पसंद नहीं करते थे, इसलिए उन्हें लगता है कि यह परेशानी भरा होगा?
5gon12eder

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

2
आप साझा राज्य में बहु-थ्रेडेड पहुंच को संभालने की योजना कैसे बनाते हैं? "परमाणु के रूप में चिह्नित और पहुंच के लिए दावेदार" यह नहीं समझाता है कि आप कैसे सोचते हैं कि यह वास्तव में काम करेगा। मुझे लगता है कि विचार के प्रति नकारात्मक दृष्टिकोण है क्योंकि लोगों को पता नहीं है कि आप वास्तव में यह काम कैसे करेंगे। या, यदि आप उचित म्यूटेक्स और जैसे का उपयोग करने के लिए जावा या सी ++ जैसे डेवलपर पर सारा बोझ डाल रहे हैं, तो लोग शायद सोच रहे हैं कि वे उस वातावरण में जटिलता और प्रोग्रामिंग जोखिम क्यों चाहते हैं जो इससे मुक्त है।
jfriend00

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

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

जवाबों:


70

1) मल्टीथ्रेडिंग बेहद कठिन है, और दुर्भाग्यवश जिस तरह से आपने इस विचार को प्रस्तुत किया है उसका तात्पर्य है कि आप कितना कठिन है इसे कम करके आंका जा रहा है।

फिलहाल, ऐसा लगता है कि आप बस भाषा में "थ्रेड्स" जोड़ रहे हैं और बाद में इसे सही और निष्पादित करने के तरीके के बारे में चिंता कर रहे हैं। विशेष रूप से:

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

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

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

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

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

शायद इसीलिए लोग आपको गंभीरता से नहीं लेते।

2) एकल घटना लूप की सादगी और मजबूती एक बहुत बड़ा फायदा है।

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

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

3) जावास्क्रिप्ट पहले से ही प्रोग्रामर को थ्रेड मैनेजमेंट को उजागर किए बिना "बैकग्राउंड थ्रेड्स" (वेबवर्क) और एसिंक्रोनस प्रोग्रामिंग का समर्थन करता है।

उन विशेषताओं में पहले से ही बहुत सारे सामान्य उपयोग के मामलों को हल किया गया है जो वास्तविक घटना में जावास्क्रिप्ट प्रोग्रामर को प्रभावित करते हैं, बिना सिंगल इवेंट लूप की सुरक्षा को प्रभावित करते हैं।

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


पुनश्च क्या मुझे एक बहुआयामी नोड पर लागू करने की कोशिश करने के लिए मनाएगा। जेएस कार्यान्वयन?

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

एक बार जब आप ऐसा कर लेते हैं, तो मुझे लगता है कि आप लोगों को इस विचार में अधिक रुचि लेंगे।


1
1) ठीक है, मैं मानता हूँ कि मैं कुछ समय के लिए सिंक्रनाइज़ेशन के मुद्दे को बंद कर रहा हूं। जब मैं कहता हूँ कि 'दो कार्यों का तर्क होगा', कि मेरे डिजाइन नहीं है, यह मुख्य रूप से एक अवलोकन है: dl.dropboxusercontent.com/u/27714141/... - मुझे यकीन है कि जादू टोने की किस तरह JavaScriptCore यहां प्रदर्शन कर रहा है नहीं कर रहा हूँ, लेकिन shouldn ' यदि यह स्वाभाविक रूप से परमाणु नहीं थे तो यह स्ट्रिंग दूषित हो जाती है? 2) मैं दृढ़ता से असहमत हूं। यही कारण है कि जेएस को एक खिलौना भाषा के रूप में देखा जाता है। 3) ES6 वादे बहुत अधिक प्रदर्शनकारी होंगे यदि एक थ्रेड पूल अनुसूचक का उपयोग करके कार्यान्वित किया जाता है।
वूडूअट्टैक

13
@voodooattack "यही कारण है कि JS को खिलौना भाषा के रूप में देखा जाता है।" नहीं, यही कारण है कि आप इसे एक खिलौना भाषा मानते हैं। लाखों लोग हर दिन जेएस का उपयोग करते हैं और इससे पूरी तरह से खुश हैं, कमियों और सभी। सुनिश्चित करें कि आप एक ऐसी समस्या को हल कर रहे हैं जो वास्तव में अन्य लोगों के पास है, जो सिर्फ भाषा बदलने से बेहतर हल नहीं है।
क्रिस हेस

@ChrisHayes सवाल यह है कि जब मैं उन्हें ठीक कर सकता हूं तो इसकी कमियों को क्यों रखा जाए? एक सुविधा में सुधार के रूप में संक्षिप्त नाम जावास्क्रिप्ट होगा?
वूडूअट्टैक

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

7
@voodooattack जो लोग जावास्क्रिप्ट को एक खिलौना भाषा कहते हैं, वे नहीं जानते कि वे किस बारे में बात कर रहे हैं। क्या यह हर चीज के लिए भाषा है? बेशक, लेकिन इसे इस तरह से खारिज करना निश्चित रूप से एक गलती है। यदि आप इस धारणा को दूर करना चाहते हैं कि जेएस एक खिलौना भाषा है, तो इसमें एक गैर-तुच्छ, उत्पादन आवेदन करें, या किसी मौजूदा को इंगित करें। बस संगामिति जोड़ने से उन लोगों का दिमाग नहीं बदलेगा, वैसे भी।
jpmc26

16

बस अपने दृष्टिकोण में एक समस्या को प्रदर्शित करने के लिए यहां अनुमान लगा रहे हैं। मैं इसे वास्तविक कार्यान्वयन के खिलाफ परीक्षण नहीं कर सकता क्योंकि कहीं भी कोई लिंक नहीं है ...

मैं कहूंगा कि यह इसलिए है क्योंकि हमेशा एक वेरिएबल के मान से इन्वेंट्री को व्यक्त नहीं किया जाता है, और 'एक वेरिएबल' सामान्य मामले में लॉक होने की गुंजाइश के लिए पर्याप्त नहीं है। उदाहरण के लिए, कल्पना करें कि हमारे पास एक अपरिवर्तनीय है a+b = 0(दो खातों के साथ एक बैंक का शेष)। नीचे दिए गए दो कार्य यह सुनिश्चित करते हैं कि आक्रमणकारी हमेशा प्रत्येक फ़ंक्शन (एकल-थ्रेडेड जेएस में निष्पादन की इकाई) के अंत में आयोजित किया जाता है

function withdraw(v) {
  a -= v;
  b += v;
}
function deposit(v) {
  b -= v;
  a += v;
}

अब, अपनी बहु दुनिया में, क्या होता है जब दो धागे निष्पादित withdrawऔर depositएक ही समय में? धन्यवाद, मर्फी ...

(आपके पास ऐसा कोड हो सकता है जो + = और - = विशेष रूप से व्यवहार करता है, लेकिन यह कोई मदद नहीं है। कुछ बिंदु पर, आपके पास एक फ़ंक्शन में स्थानीय स्थिति होगी, और एक ही समय में दो वेरिएबल्स को 'लॉक' करने का कोई तरीका नहीं होगा। उल्लंघन किया जा सकता है।)


EDIT: अगर आपका कोड शब्दशः https://gist.github.com/thriqon/f94c10a45b7e0bf656781b0f4a07292a पर गो कोड के समतुल्य है , तो मेरी टिप्पणी सटीक है ;-)


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

3
@voodooattack "मैंने अभी-अभी परीक्षण किया है ..." क्या आपने कभी थ्रेड शेड्यूलिंग के साथ असंगत निष्पादन आदेश का सामना नहीं किया है? यह मशीन से मशीन तक, रन से रन में भिन्न होता है। संचालन कैसे निर्धारित किया जाता है, इसके लिए तंत्र की पहचान किए बिना एकल परीक्षण (या यहां तक ​​कि एक सौ परीक्षण!) बैठना और चलाना बेकार है।
jpmc26

4
@voodooattack समस्या यह है कि बस संगामिति का परीक्षण उपयोगी नहीं है। आपको यह साबित करने में सक्षम होने की आवश्यकता है कि आक्रमणकारी पकड़ जाएगा, या तंत्र कभी भी उत्पादन में भरोसा नहीं कर सकता है।
सपि

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

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

15

एक दशक पहले या ब्रेंडन ईच (जावास्क्रिप्ट के आविष्कारक) ने थ्रेड्स सक नामक एक निबंध लिखा था , जो निश्चित रूप से जावास्क्रिप्ट के डिजाइन पौराणिक कथाओं के कुछ विहित दस्तावेजों में से एक है।

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


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

12
जबकि मैं समझता हूं कि आप सामान्य रूप से उनकी राय और यहां तक ​​कि जावास्क्रिप्ट के लिए आपके तिरस्कार को क्यों नहीं छोड़ेंगे, मुझे समझ में नहीं आता है कि आपका दृष्टिकोण डोमेन में उनकी विशेषज्ञता की उपेक्षा करने की अनुमति कैसे देगा।
बिली क्रावेंस

4
@BillyCravens haha, यहां तक ​​कि जावास्क्रिप्ट पर विहित पुस्तक: क्रॉकफोर्ड द्वारा "जावास्क्रिप्ट द गुड पार्ट्स " शीर्षक में खेल को दूर करता है। ईच के व्यवहार को उसी तरह से
समझें

13
@PhilWright: उनकी जावास्क्रिप्ट का पहला कार्यान्वयन एक लिस्प संस्करण था। जो मुझे बहुत सम्मान देता है। उनके बॉस का फैसला उन्हें लिस्प सिंटैक्स को सी-जैसे सिंटैक्स के साथ बदलने के लिए मजबूर करने का नहीं है। इसके मूल में जावास्क्रिप्ट अभी भी एक लिस्प रनटाइम है।
स्लीवतमैन

7
@PhilWright: आपको ईच को भाषा की दुर्दशा के लिए दोष नहीं देना चाहिए। यह प्रारंभिक कार्यान्वयन में बग है, और जेएस को परिपक्व होने से रोकने वाली वेब भाषा के लिए पश्च-संगतता की आवश्यकता है। मुख्य अवधारणाएं अभी भी एक अद्भुत भाषा बनाती हैं।
बर्गी

8

परमाणु पहुंच धागे-सुरक्षित व्यवहार में अनुवाद नहीं करता है।

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

जावास्क्रिप्ट को शुरू से सिंगल थ्रेडेड और सैंडबॉक्स किया गया है और सभी कोड इन मान्यताओं को ध्यान में रखते हुए लिखे गए हैं।

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


यही कारण है कि मुझे लगता है कि अनुसूचक एपीआई उन्नत पक्ष पर अधिक होना चाहिए, और आंतरिक रूप से उन वादों और कार्यों के लिए उपयोग किया जाना चाहिए जिनके कोई दुष्प्रभाव नहीं हैं।
voodooattack

6

क्या आपका दृष्टिकोण प्रदर्शन को बेहतर बनाने वाला है?

संदिग्ध। आपको वास्तव में यह साबित करने की आवश्यकता है।

क्या आपका दृष्टिकोण कोड लिखना आसान / तेज़ करने वाला है?

निश्चित रूप से नहीं, सिंगल थ्रेडेड कोड की तुलना में मल्टीथ्रेडेड कोड सही होने के लिए कई गुना कठिन है।

क्या आपका दृष्टिकोण अधिक मजबूत होने जा रहा है?

गतिरोध, दौड़ की स्थिति आदि को ठीक करने के लिए एक बुरा सपना है।


2
नोड.जेएस का उपयोग करके एक रेअटरर बनाने का प्रयास करें, अब इसे थ्रेड्स के साथ फिर से आज़माएं। बहु-प्रक्रिया सब कुछ नहीं है।
voodooattack

8
@voodooattack, उनके दाहिने दिमाग में कोई भी जावास्क्रिप्ट के साथ या बिना थ्रेडिंग का उपयोग करते हुए एक किरण-अनुरेखक नहीं लिखेगा, क्योंकि यह एक अपेक्षाकृत सरल, लेकिन संगणना-गहन एल्गोरिथ्म है जो पूरी तरह से संकलित भाषा में लिखा गया है, अधिमानतः एक SIMD समर्थन के साथ । जावास्क्रिप्ट का उपयोग किस तरह की समस्याओं के लिए किया जाता है, बहु-प्रक्रिया पर्याप्त से अधिक है।
जनवरी को जन हडेक

@JanHudec: हे, जे एस SIMD समर्थन प्राप्त करने के रूप में अच्छी तरह :-) जा रहा है hacks.mozilla.org/2014/10/introducing-simd-js
Bergi

2
@voodooattack यदि आप उनके बारे में नहीं जानते हैं, तो SharedArrayBuffers पर एक नज़र डालें । जावास्क्रिप्ट में अधिक संगामिति निर्माण हो रहे हैं, लेकिन वे अत्यधिक सावधानी से जोड़े जा रहे हैं, विशिष्ट दर्द बिंदुओं को संबोधित करते हुए, खराब डिजाइन निर्णय लेने को कम करने की कोशिश कर रहे हैं जिन्हें हमें वर्षों तक रहना होगा।
पुनर्विकसित मोना

2

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

आप यह पता लगाने में सहायता के लिए कि क्या मॉडल उन प्रकार के लाभ प्रदान करते हैं, आप संगामिति के अन्य मॉडलों (उदा: संदेश पासिंग) को देख सकते हैं।


1
मुझे लगता है कि ES6 वादे मेरे कार्यान्वयन के मॉडल से लाभान्वित होंगे, क्योंकि वे पहुंच के लिए संघर्ष नहीं करते हैं।
वूडूअट्टैक

WebWorkers विनिर्देश पर एक नज़र है। एनपीएम पैकेज हैं जो उनके कार्यान्वयन को प्रदान करते हैं लेकिन आप उन्हें पैकेज के बजाय अपने इंजन के मूल के रूप में लागू कर सकते हैं
अंकुर

JavaScriptCore (जेएस का वेबकीट कार्यान्वयन मैं उपयोग कर रहा हूं) पहले से ही उन्हें लागू करता है, यह सिर्फ एक संकलन ध्वज है।
वूडूअट्टैक

ठीक। WebWorkers संदेश पारित करने के साथ संगामिति हैं। आप उनके साथ अपने रेमिट्रेटर उदाहरण की कोशिश कर सकते हैं और इसे उत्परिवर्तनीय राज्य दृष्टिकोण के साथ तुलना कर सकते हैं।
अंकुर

4
संदेश पासिंग को हमेशा म्यूट स्टेट के शीर्ष पर लागू किया जाता है, जिसका अर्थ है कि यह धीमा होगा। मैं आपकी बात यहां देखने में विफल हूं। : - /
voodooattack

1

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

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


4
लेकिन "गणित और जैव सूचना विज्ञान" को C #, JAVA, या C ++
Ian

वास्तव में उन क्षेत्रों में पायथन और पर्ल प्रमुख भाषाएं हैं।
ड्राईजोव

1
दरअसल, मैं इसे लागू करने का मुख्य कारण मशीन सीखने के अनुप्रयोगों के कारण है। तो आपके पास एक बिंदु है।
वूडूअट्टैक

@dryajov खुशी है कि आप नहीं जानते कि कम्प्यूटेशनल विज्ञान के कुछ क्षेत्रों में कितना बड़ा FORTRAN है ...
cmaster

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

0

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

यदि आप इसे नियमित रूप से npm मॉड्यूल में बनाने के लिए एक तरीका के साथ आ सकते हैं जो संभावना नहीं लगती है, तो आप कुछ लोगों को इसका उपयोग कर सकते हैं।


क्या आपका मतलब है कि जेएस प्रोग्रामर एनपीएम पर वेंडर-लॉक हैं?
वूडूअट्टैक

3
सवाल एक नए रनटाइम सिस्टम के बारे में है और कुछ npm मॉड्यूल के बारे में नहीं है और यह भी साझा किए जाने योग्य राज्य की समसामयिकता वास्तव में एक पुराना विचार है।
अंकुर

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