咱們在Python異步程序編寫中常常要用到以下的結構python
import asyncio
async def doAsync():
await asyncio.sleep(0)
#...
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(doAsync())
loop.close()複製代碼
這固然是很不錯的,但當你第二次使用loop的時候程序就會拋出異常RuntimeError: Event loop is closed
,這也無可厚非,理想的程序也應該是在一個時間循環中解決掉各類異步IO的問題。
但放在終端環境如Ipython中,若是想要練習Python的異步程序的編寫的話每次都要從新開啓終端未免太過於麻煩,這時候要探尋有沒有更好的解決方案。異步
咱們能夠使用asyncio.new_event_loop
函數創建一個新的事件循環,並使用asyncio.set_event_loop
設置全局的事件循環,這時候就能夠屢次運行異步的事件循環了,不過最好保存默認的asyncio.get_event_loop
並在事件循環結束的時候還原回去。
最終咱們的代碼就像這樣。async
import asyncio
async def doAsync():
await asyncio.sleep(0)
#...
def runEventLoop()
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(doAsync())
loop.close()
if __name__ == "__main__":
oldloop = asyncio.get_event_loop()
runEventLoop()
runEventLoop()
asyncio.set_event_loop(oldloop)複製代碼
事件循環原本就是要一塊兒作不少事情,在正式的Python代碼中仍是隻用一個默認的事件循環比較好,平時的學習練習的話卻是隨意了。函數