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