1. 程式人生 > >【python 非同步IO】Python async/await 介紹

【python 非同步IO】Python async/await 介紹

Python3.5增加了內建的async和await關鍵字。讓我們用幾個小例子來展示一下這兩個關鍵字如何使用。

如果你不明白什麼是“非同步程式設計”,你可以簡單地理解它為“在單個程序中同時處理多個任務的一種方法”。我們通常使用的程序經常花費大量的時間等待IO操作的完成。這種IO操作包括客戶端請求網路、讀取檔案、查詢資料庫等等….同步程式一般是等待IO操作完成後再進行下一個任務,而非同步程式則可以在IO操作期間去處理下一個任務。

這和你準備早餐的步驟有點相似。你煮了咖啡和茶,但是你不會待在那裡等咖啡和茶煮好,而是直接去做飯或者烤麵包了。你會並行地做多件事,當其中某項完成時,你會得到一個通知(可能是你的咖啡機或者電飯煲會叫)。這樣,雖然你是一個程序,但是你能夠更高效地同時完成很多工作。

我們下面看一個簡單的例子,這裡我們用asyncio.sleep模擬耗時的IO操作,並用asyncio.wait讓它們並行執行.

python 3.4

import asyncio

@asyncio.coroutine
def slow_operation(n):
    yield from asyncio.sleep(1)
    print("Slow operation {} complete".format(n))


@asyncio.coroutine
def main():
    yield from asyncio.wait([
        slow_operation(1
), slow_operation(2), slow_operation(3), ]) loop = asyncio.get_event_loop() loop.run_until_complete(main())

以下python 3.5

import asyncio

async def slow_operation(n):
    await asyncio.sleep(1)
    print("Slow operation {} complete".format(n))


async def main():
    await asyncio.wait([
        slow_operation(1
), slow_operation(2), slow_operation(3), ]) loop = asyncio.get_event_loop() loop.run_until_complete(main())

新的async和await關鍵字清楚地表明我們在寫的是一個非同步函式,而不是普通的生成器。