2017-04-27 10 views
5

में loop.close asyncio.get_event_loop को कॉल करने के बाद नया इवेंट लूप नहीं बना सकता है, asyncio.get_event_loop() से प्राप्त लूप पर loop.close() को कॉल करने के बाद Python3.6.1 में, एक नया लूप बनाया जा सकता है ?पाइथन 3.6.1

मैंने लूप को ठीक से बंद करने के लिए उत्तर के साथ अन्य पोस्टों को देखा है, और task.cancel() का उपयोग कैसे करें, लेकिन उन उदाहरणों में से किसी एक का उपयोग करने में सक्षम नहीं है जो एक नया पाश देगा पहले बंद होने के बाद बनाया जाना चाहिए। मैंने निष्पादक को स्पष्ट रूप से सेट करने और बाद में निष्पादक को कॉल करने का प्रयास किया। शटडाउन (प्रतीक्षा = सही), लेकिन इससे मदद नहीं मिली। मैंने 'डेल लूप' भी कोशिश की, और डेल अन्य चीजों का एक गुच्छा।

दस्तावेज़ीकरण इंगित करता है कि एक इवेंट लूप बंद करना बेवकूफ और अपरिवर्तनीय है। क्या इसका यह भी अर्थ है कि एक नया पाश नहीं बनाया जा सकता है? ``

#!/usr/bin/env python3.6 
''' 
To demonstrate an issue, the following code was adapted from: 
https://docs.python.org/3/library/asyncio-eventloop.html 
''' 
import asyncio 

def hello_world(loop): 
    print('Hello World') 
    loop.stop() 

loop = asyncio.get_event_loop() 
loop.call_soon(hello_world, loop) 
loop.run_forever() 
# loop.close() 


''' 
If the commented out loop.close() above is uncommented, 
the following code will fail with: 
    Traceback (most recent call last): 
     File "./aquestion.py", line 28, in <module> 
      loopNew.call_soon(hello_world, loopNew) 
     File "/Library/Frameworks/Python.framework/Versions/3.6/lib /python3.6/asyncio/base_events.py", line 573, in call_soon 
     self._check_closed() 
     File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/asyncio/base_events.py", line 357, in _check_closed 
      raise RuntimeError('Event loop is closed') 
    RuntimeError: Event loop is closed 

''' 
loopNew = asyncio.get_event_loop() 
loopNew.call_soon(hello_world, loopNew) 
loopNew.run_forever() 

मेरे सवाल का जवाब करने के लिए कोई भी प्रयास की सराहना की जाएगी:

यहाँ मुद्दा प्रदर्शित करने के लिए कुछ सरल उदाहरण कोड है।

वैकल्पिक रूप से, क्या यह एक ईवेंट लूप बनाने के लिए खराब फॉर्म होगा, इसे विभिन्न उद्देश्यों के लिए उपयोग करें, और फिर उस लूप को बंद करें जब लंबे समय तक चलने वाला प्रोग्राम बाहर निकलने वाला है? यह सिर्फ गलत लगता है।

उत्तर

12

asyncio.get_event_loop वर्तमान पाश देता है। यह लूप की स्थिति पर कोई ध्यान नहीं देता है। यदि आपको बंद करने के बाद एक नया लूप चाहिए, तो आप asyncio.new_event_loop का उपयोग कर सकते हैं।

ध्यान रखें कि एक नया पाश प्राप्त करने से बाद में get_event_loop पर कॉल प्रभावित नहीं होंगे। यदि आप चाहते हैं कि मूल के बजाय अपना नया लूप वापस कर दें (विशेष रूप से जब से आपने इसे बंद कर दिया हो), तो आपको asyncio.set_event_loop स्वयं को कॉल करने की आवश्यकता होगी।

import asyncio 

async def f(): 
    await asyncio.sleep(0) 

loop = asyncio.get_event_loop() 
loop.run_until_complete(f()) 
loop.close() 

loop = asyncio.new_event_loop() 
asyncio.set_event_loop(loop) 
+0

बहुत बहुत धन्यवाद !!! यह बहुत अच्छा काम किया। मैंने पहले new_event_loop की कोशिश की थी, लेकिन मैंने उस प्रयोग के दौरान कुछ गलत किया होगा। –

+0

मैंने 'set_event_loop' का उल्लेख करने की उपेक्षा की। यह आपके द्वारा चलाई गई समस्याओं से संबंधित हो सकता है। मैंने इसे शामिल करने के लिए उत्तर अपडेट किया है। – dirn