Python中異步程序編寫時候多次循壞問題總結

問題:

在《每日一課》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


發佈了60 篇原創文章 · 獲贊 33 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章