2009-04-03 13 views
120

कोरआउटिन और निरंतरता और जनरेटर के बीच क्या अंतर है?कोरआउटिन बनाम निरंतर बनाम जनरेटर

+1

मुझे आश्चर्य है कि कोरआउट और निरंतरता प्रभावी ढंग से बराबर होती है। मुझे पता है कि निरंतरता के साथ कोरआउट को मॉडल करना संभव है, लेकिन क्या कोरआउट के साथ निरंतरता मॉडल करना संभव है या नहीं क्योंकि निरंतरता सख्ती से अधिक शक्तिशाली हैं? – nalply

उत्तर

102

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

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

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

def my_coroutine_body(*args): 
    while True: 
     # Do some funky stuff 
     *args = yield value_im_returning 
     # Do some more funky stuff 

my_coro = make_coroutine(my_coroutine_body) 

x = 0 
while True: 
    # The coroutine does some funky stuff to x, and returns a new value. 
    x = my_coro(x) 
    print x 

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

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

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

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

def foo(x, y, cc): 
    cc(max(x, y)) 

biggest = callcc(foo, [23, 42]) 
print biggest 

क्या होगा यह है कि callcc() होगा वर्तमान निरंतरता (cc) के साथ बारी कॉल foo() में, कि है, कार्यक्रम, जिस पर callcc() बुलाया गया था में बात करने के लिए एक संदर्भ। जब foo() वर्तमान निरंतरता को कॉल करता है, तो यह अनिवार्य रूप से वही है जो callcc() को उस मूल्य के साथ लौटने के लिए कहता है, जिसके साथ आप वर्तमान निरंतरता को बुला रहे हैं, और जब ऐसा होता है, तो यह उस स्थिरता को वापस ले जाता है जहां वर्तमान निरंतरता बनाई गई थी, यानी, कब आपने callcc() कहा।

इसका परिणाम यह होगा कि हमारा काल्पनिक पायथन संस्करण '42' प्रिंट करेगा।

मुझे उम्मीद है कि मदद करता है, और मुझे यकीन है कि मेरी व्याख्या काफी सुधार हो सकती है!

+6

एक नाइट: _delimited_ निरंतरताएं कार्य हैं, लेकिन _undelimited_ निरंतरताएं नहीं हैं: http://okmij.org/ftp/continuations/undelimited.html#delim-vs-undelim –

+2

यह एक अच्छा बिंदु है। उस ने कहा, ज्यादातर व्यावहारिक अनुप्रयोगों में, जब लोग 'निरंतरता' कहते हैं, तो वे आंशिक/सीमित निरंतरताओं के बारे में बात कर रहे हैं। विभिन्न अन्य प्रकार की निरंतरताओं में लाने से कुछ हद तक स्पष्टीकरण मिल जाएगा। –

+1

निरंतरता कार्य नहीं हैं, हालांकि उन्हें कार्यों में सुधार किया जा सकता है। "उन्होंने कहा, ज्यादातर व्यावहारिक अनुप्रयोगों में, जब लोग 'निरंतरता' कहते हैं, तो वे आंशिक/सीमित निरंतरताओं के बारे में बात कर रहे हैं।" क्या आप "निरंतरता" शब्द के इस तरह के उपयोग को इंगित करेंगे? मैंने कभी इस तरह के उपयोग से मुलाकात नहीं की है। कॉल/सीसी का उपयोग करके आपने एक अवांछित निरंतरता के लिए एक उदाहरण भी दिया। सीमित निरंतरता के लिए ऑपरेटर आमतौर पर "रीसेट" और "शिफ्ट" होते हैं (उनके पास अन्य नाम हो सकते हैं)। – Ivancho

28

कोरोटाइन कई प्रक्रियाओं में से एक है जो अपना काम कर लेता है और फिर समूह में अन्य कोरआउटों को नियंत्रण देने के लिए रोक देता है।

निरंतरता "एक फ़ंक्शन के लिए सूचक" है जिसे आप कुछ प्रक्रिया में पास करते हैं, जिसे निष्पादित करने के लिए ("जारी रखा जाता है") जब यह प्रक्रिया पूरी की जाती है।

जेनरेटर (.NET में) एक भाषा निर्माण है जो विधि को निष्पादित करता है, विधि को "रोक" निष्पादित करता है और फिर अगले मान के लिए पूछे जाने पर उसी बिंदु से आगे बढ़ता है।

+0

मुझे एहसास है कि उत्तर सटीक नहीं हो सकता है लेकिन इस स्तर के प्रश्न पर मैंने इसे सरल रखने की कोशिश की। इसके अलावा, मैं वास्तव में यह सब समझ नहीं पा रहा हूं :) – zvolkov

+0

पायथन में जनरेटर सी # संस्करण के समान है, लेकिन इसे इटरेटर ऑब्जेक्ट का उदाहरण बनाने के लिए एक विशेष वाक्यविन्यास के रूप में कार्यान्वित किया जाता है, जो "फ़ंक्शन" द्वारा लौटाए गए मान देता है "परिभाषा जो आप प्रदान करते हैं। – Benson

+2

एक छोटा सुधार: "... कॉल स्टैक और सभी चर सहित - लेकिन उनके मूल्य नहीं" (या बस "सभी चर" ड्रॉप)। निरंतरता मानों को संरक्षित नहीं करती है, उनमें केवल कॉल स्टैक होता है। – nalply

7

पायथन के नए संस्करण में, आप जेनरेटर को generator.send() के साथ मूल्य भेज सकते हैं, जो पाइथन जनरेटर प्रभावी ढंग से coroutines बनाता है।

पाइथन जेनरेटर और अन्य जेनरेटर के बीच मुख्य अंतर, ग्रीनलेट कहता है, कि अजगर में, आपका yield value केवल कॉलर पर वापस लौटा सकता है। ग्रीनलेट में, target.switch(value) आपको एक विशिष्ट लक्ष्य कोरोटाइन पर ले जा सकता है और एक मूल्य उत्पन्न कर सकता है जहां target चलना जारी रहेगा।

+3

लेकिन पायथन में, सभी 'उपज' कॉल एक ही कार्य में होनी चाहिए, जिसे "जनरेटर" कहा जाता है। आप उप-फ़ंक्शन से 'उपज' नहीं कर सकते हैं, यही कारण है कि पाइथन को * सेमी-कोरआउट * कहा जाता है, जबकि लुआ * असममित कोरआउट * है। (उपज को प्रसारित करने के प्रस्ताव हैं, लेकिन मुझे लगता है कि वे केवल पानी को गंदे करते हैं।) – cdunn2001

+4

@ cdunn2001: (विंस्टन द्वारा टिप्पणी) पायथन 3.3 ने "उपज से" उपज पेश की जो आपको उप-जनरेटर से उपज करने देती है। –

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