Python 異步編程——asyncio和await

asyncio 模塊。asyncio模塊具有優秀的特性,允許我們編寫更高效的 Python 異步應用。我們將探討如何在 Python 中管理異步事件循環。在深入探討這個主題之前,讓我們先了解一下什麼是異步編程。

什麼是異步編程?

在同步編程中,方法被編寫成一次執行一個任務。如果一個函數依賴於另一個函數的輸出,它必須等待該函數的執行完成。程序實際上是停止的,直到函數完成它的執行。這意味着一次可以執行一個程序。

這降低了程序的速度,因為它被迫停止並等待一些事情完成。系統中有許多進程器可用,因此做其他任務而不是理想的 sit 是對資源的浪費。

為了克服這一點,異步編程概念開始發揮作用。它的行為不同;它也需要一次執行一次。但是系統可能不會等到執行完畢再繼續下一步。

這意味着,如果程序將執行另一項任務,而前一項任務尚未完成並仍在其他地方運行,則處理器並不理想。

在本教程中,我們將解釋為什麼我們需要這樣一種類型的編程。

什麼是異步輸入輸出?

asyncio 是一個 Python 庫,用於使用異步/等待運行並發代碼。它是 Python 異步框架的基礎,提供連接庫、網絡和 web 服務器、數據庫分布式任務隊列、高性能等。

該模塊提供了圍繞事件循環工作的框架,並且還處理輸入/輸出和系統事件等事情。

協同工作和任務

asyncio 是一個 Python 庫,用於使用異步/等待運行並發代碼。它是 Python 異步框架的基礎,提供連接庫、網絡、網絡服務器、數據庫分布式任務隊列、高性能等。

該模塊提供了圍繞事件循環工作的框架,並處理輸入/輸出和系統事件等事務。

示例- 1


import asyncio
async def main():
    print ("Waiting 5 seconds. ")
    for _ in range(5):
        await asyncio.sleep(1)
        print ("Hello")
    print ("Finished waiting.")
asyncio.run(main())

輸出:

Waiting 5 seconds. 
Hello
Hello
Hello
Hello
Hello
Finished waiting.

解釋-

在上面的代碼中-

  • 我們已經導入了 asyncio模塊來訪問 Python 異步功能。
  • 然後創建一個 primary() 函數,並在前面寫 async 關鍵字。這將允許程序異步運行任務。
  • 我們使用 for循環並調用sleep()方法,這迫使我們等待 1 秒鐘。
  • 程序一秒鐘後打印“你好”。
  • 程序應該有一個。運行()功能以及一個。main() 功能。

我們還可以安排任務或對象來綁定協程並幫助它們運行。讓我們理解下面的例子。

示例- 2


import asyncio
import time

async def execute(delay, value):
    await asyncio.sleep(delay)
    print(value)

async def main():
    print(f"started at {time.strftime('%X')}")

    await execute(1, 'hello')
    await execute(2, 'world')

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

輸出:

started at 11:11:54
hello
world
finished at 11:11:57

解釋-

在上面的代碼中,

  • 我們已經導入了 asyncio 和時間模塊。
  • 然後我們用延遲和值參數定義了 execute() 函數。它使用睡眠()方法打印延遲時間。
  • 在 main() 函數中,我們傳遞了兩個參數:第一個是延遲時間,第二個是要打印的值。
  • 程序開始執行並打印準確的執行時間,打印“你好”,然後等待兩秒鐘,打印“世界”並停止。

現在,讓我們對上面的代碼進行一些更改,並查看結果。

示例- 3 創建任務


async def execute(delay, value):
    await asyncio.sleep(delay)
    print(value)

async def main():
    # Using asyncio.create_task() method to run coroutines concurrently as asyncio
    task1 = asyncio.create_task(
        execute(1, 'hello'))

    task2 = asyncio.create_task(
        execute(2, 'world'))

    print(f"started at {time.strftime('%X')}")

    # Wait until both tasks are completed (should take
    # around 2 seconds.)
    await task1
    await task2

    print(f"finished at {time.strftime('%X')}")

asyncio.run(main())

輸出:

started at 15:43:30
hello
world
finished at 15:43:32

我們可以看到它比前一個程序快 1 秒。 create.task() 方法將在事件循環中運行,並將結果放入任務中。我們已經安排了這兩個任務,並使用等待返回它們。

用 Python 管理異步事件循環

Asyncio 還用於管理異步事件循環。事件循環是運行異步函數和回調的對象。當我們想要執行協程時,當我們運行 asyncio.run() 方法時,事件對於異步函數來說是至關重要的;自動創建事件循環對象。為了實現更高級的服務器,我們需要對事件循環的低級訪問。我們需要直接處理事件循環的內部。

事件循環具有以下特徵。

  • 它可以註冊、執行和取消延遲調用(異步函數)
  • 它可以為通信創建客戶機和服務器傳輸
  • 它可以為與另一個程序的通信創建子過程和傳輸。
  • 將函數調用委託給線程池。

讓我們看看下面的例子。

示例-


import asyncio

async def speech_async():
    print('This is a asynchronicity!')

loop = asyncio.get_event_loop()
loop.run_until_complete(speech_async())
loop.close()

輸出:

This is a asynchronicity!

事件循環從獲取 asyncio.get_event_loop() 開始,調度並運行異步任務,當我們完成運行時關閉事件循環。

用 Python 中的流讀寫數據

asyncio模塊提供流,用於執行高級網絡輸入/輸出。它可以充當網絡請求的服務器。它最適合於長時間運行的網絡操作,其中應用阻塞等待一些其他資源返回結果。

asyncio 有兩個類,StreamReader 和 StreamWriter 。這些類用於高級別的網絡讀寫。

要從網絡讀取,我們需要使用asyncio . open _ connection()打開網絡。我們將使用流讀取器和流寫入器對象函數返回元組。閱讀()和。將()方法寫入每個連接。

asyncio.start_server ()方法用於接收來自遠程主機的連接。該函數以回調函數 client_connected_cb 為參數。每當函數收到請求時都會調用它。

Python 中的同步任務

我們之前已經討論過,異步程序是分開運行的,但是有時我們會希望相互通信。asyncio模塊為我們提供了一個隊列和各種其他方法來建立任務之間的同步。

下面我們來了解一下下面的實現方法。

  • 隊列- 異步隊列便於異步函數排列 Python 對象,以供其他異步函數使用。例如——工作負載分布在行為上的函數之間。
  • 同步原語-asyncio 的特性鎖、事件、條件和信號量充當了傳統 Python 的對應物。

這裡有一點要時刻記住,這些方法不是線程安全的。對於在同一事件循環中運行的異步任務,這不是問題。但是我們需要使用線程模塊在任務之間共享信息。

什麼時候使用異步編程?

在下面的場景中,我們可以使用異步編程。

  • 當我們想要快速完成工作時。
  • 延遲包括等待輸入/輸出(磁盤或網絡)操作,而不是計算。
  • 當許多輸入/輸出操作同時發生時。

asyncio模塊允許我們並行執行多個任務,並高效地迭代它們,而不會阻塞應用的其餘部分。

下面給出了一些任務,它們可以很好地與 asyncio 配合使用。

  • 刮網。
  • 網絡服務(網絡服務器和框架)
  • 同步數據庫

Asyncio 中的幾個重要函數

下面是異步編程時使用的一些基本方法。

運行異步程序

  • asyncio.run(coro,* debug = False)-*此功能用於阻止 執行延遲*** 秒。它掛起當前任務,並允許另一個任務運行。延遲是一個顯示秒數的參數。

示例-


async def main():
    await asyncio.sleep(1)
    print('hello')
asyncio.run(main())

創建任務

  • *create_task(coro, name = None)-該功能將 Coroutines 包裝成一個 task,安排**執行。它返回任務對象。

示例-


async def coro():
    ...

# In Python 3.7+
task = asyncio.create_task(coro())
...
task = asyncio.ensure_future(coro())

睡眠

  • *睡眠(延遲,結果=無,循環=無)- 此功能用於阻止執行延遲執行**秒。它掛起當前任務,並允許其他任務運行。延遲是一個顯示秒數的參數。

示例-


import asyncio
async def main():
    for _ in range(3):
        await asyncio.sleep(1)
        print ("Hello")
asyncio.run(main())

超時設定

  • *協同工作等待(aw,超時,循環=無)- 該功能用於等待 aw(協同工作自動安排為任務)喚醒超時完成。

示例-


async def myfunc():
    # Sleep for ten minutes
    await asyncio.sleep(600)
    print('hello!')

async def main():
    # Wait for at most 1 second
    try:
        await asyncio.wait_for(myfunc(), timeout=1.0)
    except asyncio.TimeoutError:
        print('timeout!')

asyncio.run(main())

結論

本教程包括使用 Python asyncio模塊進行異步編程的概念。當我們使用上下文切換時,asyncio 為我們提供了對何時上下文的編程控制。這意味着我們可以處理線程編程中出現的許多複雜問題。

它是一個強大而有價值的工具,但僅適用於異步類型編程。我們已經用它們各自的例子討論了協程和任務。我們還討論了在 Python 中管理事件循環和用流讀寫數據。它還包括必要的方法。


原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/219614.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-09 11:00
下一篇 2024-12-09 11:00

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論