2010-11-24 12 views
29

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

इसके अलावा वे एरलांग प्रक्रियाओं के समान ही ध्वनि करते हैं। क्या वे एक ही चीज़ हैं?

कोई भी जो इस विषय को समझने में मेरी सहायता कर सकता है, उसकी बहुत सराहना की जाएगी।

उत्तर

35

सबसे पहले, गैर-अवरुद्ध I/O में हरी धागे या कोरआउट के साथ कुछ भी सामान्य नहीं है, लेकिन यह इस बात को प्रभावित कर सकता है कि वे कैसे निर्धारित हैं।

अब:

  • Twisted एक क्लासिक गैर अवरुद्ध I/O रूपरेखा है - आवेदन कोड async शैली कॉलबैक का उपयोग करके में लिखा है।
  • Gevent और eventlet coroutines/greenthreads/greenlets के लिए greenlet लाइब्रेरी का उपयोग करें। Eventloop चलाने के लिए एक समर्पित ग्रीनलेट है (gevent के मामले में यह सी-कोडित libevent के ईवेंट लूप) के मामले में है। जब मनमाने ढंग से ग्रीनलेट कुछ I/O ऑपरेशन की प्रक्रिया के लिए प्रतीक्षा करना शुरू कर देता है, तो यह केवल ईवेंट लूप को निष्पादन देता है, जो निष्पादन के लिए एक और ग्रीनलेट शुरू करता है (जो कुछ I/O करने के लिए तैयार है)। इसे सहकारी मल्टीटास्किंग कहा जाता है - प्रत्येक ग्रीनलेट खुद को अन्य हरितलेट पर नियंत्रण वापस करने का फैसला करता है।
  • Stackless में टास्कलेट हैं, जो हरितलेट के समान हैं, लेकिन इसे प्रीपेप्टिव मॉडल के साथ भी निर्धारित किया जा सकता है - इसका मतलब है कि शेड्यूलर किसी भी समय टास्कलेट निष्पादन को रोक सकता है और किसी अन्य टास्कलेट को निष्पादित करना शुरू कर सकता है (ओएस थ्रेड और एरलांग प्रक्रियाएं कैसे होती हैं काम)। इसके अलावा, स्टैकलेस बॉक्स के बाहर किसी भी गैर-अवरुद्ध I/O सुविधाओं को प्रदान नहीं करता है, इसलिए यदि आप stdlib के माध्यम से I/O करते हैं - तो यह पूरे ओएस थ्रेड को अवरुद्ध कर देगा, इसलिए जब आप प्रतीक्षा कर रहे हों तो कोई अन्य टास्कलेट निष्पादित नहीं हो सकता/हे। स्टैकलेस के लिए गीवेंट लाइब्रेरी का बंदरगाह प्रदान करने का प्रयास किया गया है, लेकिन मुझे नहीं पता कि यह कैसा चल रहा है।
+3

ट्विस्ट भी 'twisted.internet.defer.inline कॉलबैक' सजावट के माध्यम से कॉलबैक और राज्य मशीनों का उपयोग किए बिना एसिक्रोनस कोड लिखने की अनुमति देता है जो प्रोग्रामर को कॉलबैक के मुकाबले काफी अधिक पठनीय कोड प्राप्त करने के लिए जेनरेटर ('उपज ') आधारित कोरआउट का उपयोग करने में सक्षम बनाता है। । –

+0

* eventloop (...) * चलाने के लिए एक समर्पित ग्रीनलेट है * एक से अधिक ग्रीनलेट अपने स्वयं के ईवेंटलोप को पकड़ नहीं सकता है जो अनिवार्य रूप से इन घटनाओं को * सहयोग * करने में सक्षम करेगा? –

10

बैट लिया गया! (फिक्स स्वागत करते हैं!):

कुल मिलाकर:

  • मुड़: एकल लड़ी। 'कॉलबैक' और 'स्थगित' मुहावरे के उपयोग के माध्यम से गैर-अवरुद्ध व्यवहार प्राप्त करता है। Node.js. के समान
  • ग्रीनलेट/घटनापत्र: गैर-अवरुद्ध io प्राप्त करने के लिए 'हरे धागे' (स्मृति के वर्ग?) का उपयोग करें। असल में मानक संस्करणों के साथ मानक सीपीथन आईओ को पैच करता है, इसलिए कोड अभी भी लिखा गया है जैसे कि यह अवरुद्ध/अनुक्रमिक है।
  • स्टैकलेस: http://www.stackless.com/। इसका इस्तेमाल नहीं किया है, ऐसा लगता है कि यह 'microthreads' और अन्य niceties जोड़ता है? stackless example idioms
  • coroutines: coroutines on SO

इनमें से कोई नहीं के रूप में प्रकाश या Erlang प्रक्रियाओं के रूप में अच्छी तरह से समर्थित है।

+0

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

+0

इसके अलावा, एंड्रॉप ने कहा, ग्रीनलेट्स को गैर-अवरुद्ध आईओ के साथ कुछ लेना देना नहीं है- दोनों ऑर्थोगोनल हैं। –

8

स्टैकलेस की तुलना ग्रीनलेट से करते समय आप लगभग सही हैं। गायब बात यह है:

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

यह वास्तव में मजाकिया है- स्टैकलेस में कई और सुविधाएं हैं, स्विचिंग पर लगभग 10 गुना अधिक कुशल है, और निष्पादन स्थिति का चयन प्रदान करता है।

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

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