# 如何在 Jupyter Notebook 跑 Python 異步程式

異步是 Python 3.4 起引入的重大變革，透過 asyncio 模組與新的 `async`、`await` 語法達到與 JavaScript 類似的異步執行效果。

一個最簡單的異步程式例子：

```Python
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` 語法呼叫異步函式：

```Python
import asyncio

await asyncio.sleep(1)
```

就這麼簡單。
