問題:
在《每日一課》Python入門之異步IO中,存在着這樣一個問題,代碼如下:
import asyncio
@asyncio.coroutine
def hello():
print("Hello world!")
# 異步調用asyncio.sleep(1):
r = yield from asyncio.sleep(1)
print("Hello again!")
# 獲取EventLoop:
loop = asyncio.get_event_loop()
# 執行coroutine
loop.run_until_complete(hello())
loop.close()
這個程序是沒有問題的,但是當我們第二次使用loop的時候程序就會拋出異常RuntimeError: Event loop is closed
,這也是有一定道理的,我們理想當中的的情況也應該是在一個時間循環中解決掉各種異步IO的問題。但是因爲我們是處於練習寫程序、學習的狀態,所以每次如果總是要重啓終端再來編寫程序進行練習的話,確實過於麻煩了,所以現在就介紹一種解決方法(當然方法很多的,各有各的不同)。
方法:
可以使用asyncio.new_event_loop
函數建立一個新的事件循環,這時候就可以多次運行異步的事件循環了。
結果:
上面的代碼可以修改如下:
import asyncio
@asyncio.coroutine
def hello():
print("Hello world!")
# 異步調用asyncio.sleep(1):
r = yield from asyncio.sleep(1)
print("Hello again!")
def runEventLoop():
loop = asyncio.new_event_loop()
#asyncio.set_event_loop(loop)
loop.run_until_complete(hello())
loop.close()
runEventLoop()
這樣就可以對代碼進行自己想要的修改,而且可以反覆執行並不會拋出異常:RuntimeError: Event loop is closed