2017-04-27 4 views
5

asyncio.get_event_loop()から取得したループでloop.close()を呼び出した後、Python3.6.1で新しいループを作成できますか?Python3.6.1でloop.close asyncio.get_event_loopを呼び出した後に新しいイベントループを作成できません

私は、ループを適切に閉じるための回答と、task.cancel()の使用方法を見てきましたが、新しいループを起こすような方法でこれらの例を使用することはできませんでした最初の閉じた後に作成されます。私は明示的にexecutorを設定し、後でexecutor.shutdown(wait = True)を呼び出そうとしましたが、それは役に立ちませんでした。私はまた、 'デルループ'と他のものの束delを試みた。

ドキュメンテーションは、イベントループを閉じることが冪等であり、元に戻すことができないことを示しています。新しいループを作成できないということも意味しますか?ここで

は、問題を実証するためのいくつかの簡単なサンプルコードです: ``

#!/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は、現在のループを返します。ループの状態には何の注意も払わない。 1つを閉じた後に新しいループが必要な場合は、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

関連する問題