2016-10-19 9 views
5

मैं asyncio के लिए पायथन दस्तावेज़ के माध्यम से जा रहा था और मुझे आश्चर्य है कि Asyncio.ensure_future() के विपरीत अधिकांश उदाहरण loop.run_until_complete() का उपयोग क्यों करते हैं।अधिकांश asyncio उदाहरण loop.run_until_complete() का उपयोग क्यों करते हैं?

उदाहरण के लिए: https://docs.python.org/dev/library/asyncio-task.html

ऐसा लगता है ensure_future गैर अवरुद्ध कार्यों के फायदे प्रदर्शित करने के लिए एक बेहतर तरीका होगा। दूसरी तरफ run_until_complete, लूप को सिंक्रोनस फ़ंक्शंस जैसे ब्लॉक करता है।

इससे मुझे लगता है कि मुझे ensure_future के के संयोजन के बजाय loop.run_forever() के साथ कई सह-रूटीन चलाने के लिए उपयोग करना चाहिए।

+2

'run_until_complete' कुछ भी अवरुद्ध नहीं करता है। इसके बीच और 'run_forever' के बीच का अंतर यह है कि लूप को कोरआउटिन के पूरा होने पर रोक दिया जाता है। एकमात्र समय यह अवरुद्ध होगा यदि आपका कोरआउट कभी इंतजार नहीं कर रहा है। – dirn

+1

मैंने यह http://pastebin.com/Qi8dQ3bh लिखा है और ऐसा लगता है कि यह लूप को अवरुद्ध करता है। 'do_other_things()' निष्पादित नहीं होता है जब तक 'do_io() 'पूरा नहीं होता है, भले ही' do_io() 'नींद का इंतजार कर रहा हो। – SamuelN

+2

ऐसा इसलिए है क्योंकि लूप के साथ कुछ और निर्धारित नहीं किया गया है। 'Run_forever' को कॉल करने से पहले 'loop.create_task (do_other_things())' को कॉल करने का प्रयास करें। – dirn

उत्तर

5

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

import asyncio 

async def do_io(): 
    print('io start') 
    await asyncio.sleep(5) 
    print('io end') 

async def do_other_things(): 
    print('doing other thigns') 

loop = asyncio.get_event_loop() 

loop.run_until_complete(do_io()) 
loop.run_until_complete(do_other_things()) 

loop.close() 

do_io चलेंगे:

इस उदाहरण को देखते हुए। पूरा होने के बाद, do_other_things चलाएगा। आपका आउटपुट होगा

io start 
io end 
doing other thigns 

आप do_io चलाने से पहले घटना पाश के साथ do_other_things शेड्यूल करेंगे, तो नियंत्रण do_io से do_other_things जब पूर्व प्रतीक्षा कर रहा है में बदल जाएगी।

loop.create_task(do_other_things()) 
loop.run_until_complete(do_io()) 

यह आपको

इसका कारण यह है do_other_thingsdo_io से पहले निर्धारित किया गया था के उत्पादन में मिल जाएगा।

doing other thigns 
io start 
io end 

पर प्राप्त करने के कई अलग-अलग तरीके हैं, लेकिन जो कोई भी समझ में आता है वास्तव में आपके आवेदन पर निर्भर करता है। तो मैं पाठक को एक अभ्यास के रूप में छोड़ दूंगा।

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