異步是 Python 3.4 起引入的重大變革,透過 asyncio 模組與新的 async
、await
語法達到與 JavaScript 類似的異步執行效果。
一個最簡單的異步程式例子:
import asyncio
async def do_something():
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(do_something())
在上面的例子內有幾個 Python 異步程式的特徵:
- 由
async
關鍵字定義do_something()
為異步函式。 - 函式內有
await
關鍵字的敘述句表示該敘述可為異步執行。 -
await
後呼叫的函式asyncio.sleep()
為一個具有 awaitable 的函式,對await
關鍵字來說,後面呼叫的函式有 awaitable 屬性是必須的,否則會引發錯誤。 - 取得一個 event loop 物件,並令此 event loop 物件去執行
do_something()
。
Event loop 物件可以接受一系列的 async 函式,並互相調度,在上面的例子中,因為只有單個任務,所以用異步顯得脫褲子放屁,在真實的場景中,event loop 接受多個 async 函式後,當遇到第一個函式的 await
,異步機制就會開始作用,讓第一個函式的 await
繼續跑,並開始讓下一個函式也跑起來,以此類推直到所有 event loop 內的異步函式都跑完。
當在 Jupyter Notebook 裡跑異步程式
在 Jupyter Notebook 內可以直接使用 await
語法呼叫異步函式:
import asyncio
await asyncio.sleep(1)
就這麼簡單。
Top comments (0)