2017-05-29 30 views
7

से अलग कैसे है, जिसने एसिन्सियो कोड लिखा है, लेकिन आंतरिक कार्यप्रणाली को बेहतर ढंग से समझने के लिए देख रहा है, yield from, await और कैसे क्या वे एसिंक्रोनस कोड की अनुमति देने के लिए उपयोगी हैं?एसिन्सियो में "उपज" से "उपज" क्या होता है और यह "प्रतीक्षा"

एक highly upvoted सवाल yield from वाक्य रचना और one explaining async and await का उपयोग करता है के बारे में पूछ नहीं है, लेकिन दोनों अलग अलग विषयों के बारे में गहराई में जाने के लिए और वास्तव में अंतर्निहित कोड का एक संक्षिप्त विवरण नहीं हैं और यह कैसे asyncio साथ में फिट बैठता है।

+0

ऐसा लगता है कि आपके द्वारा लिंक किया गया दूसरा प्रश्न यह है कि 'async' और' await' का उपयोग कैसे किया जा सकता है, जिसे आप 'उपज' और 'asyncio.coroutine से उपज की आवश्यकता के बारे में अधिक संक्षेप में व्यक्त करने के लिए उपयोग कर सकते हैं। व्यक्त करने के लिए। मुझे लगता है कि मुझे सच में यकीन नहीं है कि सवाल क्या पूछ रहा है क्योंकि उस उदाहरण से यह बहुत अच्छी तरह से समझा जाता है। क्या आप अधिक विशिष्ट हो सकते हैं? – mgilson

+0

@mgilson यह 'प्रतीक्षा' से 'उपज' से संबंधित है, लेकिन वास्तव में '0 से उत्पन्न नहीं' – Atsch

+0

वे वही हैं, 'प्रतीक्षा' और अधिक [हालिया] को छोड़कर (https: //www.python। संगठन/देव/पेप्स/पेप-04 9 2 /) और बहुत बेहतर दिखता है – Vincent

उत्तर

8

लघु जवाब:

yield from coroutine के लिए इंतजार करने के लिए एक पुराने तरीका है।

await कोरआउट के लिए प्रतीक्षा करने का एक आधुनिक तरीका है।

विस्तृत जवाब:

अजगर जनरेटर है - कार्यों का विशेष प्रकार का है कि एक ही मान के बजाय परिणामों के एक दृश्य पैदा करता है। पायथन 3.3 yield from अभिव्यक्ति के साथ शुरू किया गया था। यह allows एक जनरेटर अपने ऑपरेशन के हिस्से को किसी अन्य जनरेटर को सौंपने के लिए।

पायथन 3.4 asyncio मॉड्यूल मानक पुस्तकालय में जोड़ा गया था। यह हमें स्पष्ट और समझने योग्य असीमित कोड लिखने की अनुमति देता है। तकनीकी रूप से एसिंसिओ के कोरआउट को विभिन्न तरीकों से लागू किया जा सकता है, asyncio में उन्हें जनरेटर का उपयोग करके कार्यान्वित किया गया था (आप excellent video के लिए देख सकते हैं जहां दिखाया गया है कि जेनरेटर को कोरआउट को लागू करने के लिए कैसे उपयोग किया जा सकता है)। @asyncio.coroutine जेनरेटर से कोरआउटिन बनाने का एक तरीका था और yield from कोरआउट के लिए प्रतीक्षा करने का एक तरीका था - केवल कार्यान्वयन का विवरण।

ऐसा हुआ कि yield from दो "अलग-अलग चीज़ों" के लिए उपयोग करना शुरू हुआ।

पायथन 3.5 से शुरू (देखें PEP 492) कोरआउट को नया वाक्यविन्यास मिला। अब आप async def के साथ कोरआउट को परिभाषित कर सकते हैं और await अभिव्यक्ति का उपयोग करके इसके लिए प्रतीक्षा कर सकते हैं। यह केवल लिखने के लिए छोटा नहीं है, बल्कि यह समझने में भी स्पष्ट करता है कि हम कोरआउट के साथ काम करते हैं।

यदि आप पाइथन 3.5+ का उपयोग कर रहे हैं तो आप जेनरेटर को छोड़कर yield from का उपयोग करके भूल सकते हैं और await को कोरआउट के लिए उपयोग कर सकते हैं।

+0

पवित्र सी ** पी, @ मिखाइल, मेरी इच्छा है कि मैंने अपना अधिकांश समय 'उपज' और '@ asyncio.coroutine 'के साथ बर्बाद करने से पहले इसे पढ़ा था ! फिर मैंने 'async def' और' await' पढ़ा, और मैं चला गया "ummmm, मुझे आश्चर्य है कि क्या अंतर है"। मेरी इच्छा है कि यह [पीईपी 3156] में स्पष्ट हो गया हो (https://www.python.org/dev/peps/pep-3156) ... – Marco

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