[Python]在一段Python程序中使用屢次事件循環

背景

咱們在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代碼中仍是隻用一個默認的事件循環比較好,平時的學習練習的話卻是隨意了。函數

相關文章
相關標籤/搜索