Python 中的非同步程式設計

Vaibhhav Khetarpal 2023年10月10日
  1. Python 中非同步程式設計的概念
  2. 在 Python 中使用 asyncio 模組實現 async 關鍵字
Python 中的非同步程式設計

非同步程式設計是程式設計的一個有用方面,可以藉助 async IO 模組在 Python 中實現。本教程討論非同步 IO 以及如何在 Python 中實現它。

Python 中非同步程式設計的概念

非同步程式設計是一種並行程式設計,它允許工作的指定部分與執行應用程式的主執行緒分開執行。

我們利用 asyncio 包作為 Python 中幾個非同步框架的基礎。

Python 中的 asyncio 包提供了一個急需的基礎和一堆有助於協程任務的高階 API。

自從以 Python 3.5 版本包含在 Python 程式設計中以來,非同步程式設計得到了強大的發展。由於它依賴於非同步程式設計,因此它已成為諸如 Node.JS 等一些語言流行的核心。

在 Python 中使用 asyncio 模組實現 async 關鍵字

在 Python 中,asyncio 模組引入了兩個新關鍵字,asyncawait

我們將舉一個示例程式碼並提供其解決方案。之後,我們將通過 asyncio 模組採用非同步程式設計方法來嘗試相同的問題。

下面是一個帶有一般方法的片段。

import time


def sleep():
    print(f"Time: {time.time() - begin:.2f}")
    time.sleep(1)


def addn(name, numbers):
    total = 0
    for number in numbers:
        print(f"Task {name}: Computing {total}+{number}")
        sleep()
        total += number
    print(f"Task {name}: Sum = {total}\n")


begin = time.time()
tasks = [
    addn("X", [1, 2]),
    addn("Y", [1, 2, 3]),
]
termi = time.time()
print(f"Time: {termi-begin:.2f} sec")

輸出:

Task X: Computing 0+1
Time: 0.00
Task X: Computing 1+2
Time: 1.00
Task X: Sum = 3

Task Y: Computing 0+1
Time: 2.00
Task Y: Computing 1+2
Time: 3.00
Task Y: Computing 3+3
Time: 4.00
Task Y: Sum = 6

Time: 5.02 sec

一般的方法需要 5.02 秒的總時間。

現在,讓我們在下面的程式碼塊中藉助 asyncio 模組使用非同步程式設計方法。

import asyncio
import time


async def sleep():
    print(f"Time: {time.time() - begin:.2f}")
    await asyncio.sleep(1)


async def addn(name, numbers):
    total = 0
    for number in numbers:
        print(f"Task {name}: Computing {total}+{number}")
        await sleep()
        total += number
    print(f"Task {name}: Sum = {total}\n")


begin = time.time()
loop = asyncio.get_event_loop()
tasks = [
    loop.create_task(addn("X", [1, 2])),
    loop.create_task(addn("Y", [1, 2, 3])),
]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
termi = time.time()
print(f"Time: {termi-begin:.2f} sec")

輸出:

Task X: Computing 0+1
Time: 0.00
Task Y: Computing 0+1
Time: 0.00
Task X: Computing 1+2
Time: 1.00
Task Y: Computing 1+2
Time: 1.00
Task X: Sum = 3

Task Y: Computing 3+3
Time: 2.00
Task Y: Sum = 6

Time: 3.00 sec

當我們新增 asyncio 時,我們在程式碼中調整 sleep() 函式。

從上面的輸出中可以看出,非同步程式設計將總時間縮短到 3.0 秒。這表明了非同步程式設計的必要性和實用性。

asyncio 模組的幫助下,我們已經成功地在一個簡單的 Python 程式碼上實現了非同步程式設計。

當非同步程式設計可以通過使用執行緒的經典方法實現時,為什麼我們需要使用 asyncio 模組?

答案將是 Python 的全域性直譯器鎖限制了執行緒的效能和使用不使用解釋程式碼的指令。asyncio 包沒有這樣的問題,因為使用了外部服務。

Vaibhhav Khetarpal avatar Vaibhhav Khetarpal avatar

Vaibhhav is an IT professional who has a strong-hold in Python programming and various projects under his belt. He has an eagerness to discover new things and is a quick learner.

LinkedIn