Python 中的 AsyncIO 基礎(chǔ)知識(shí)
雖然有一些方法可以在Python中實(shí)現(xiàn)并行編程,但它默認(rèn)是單線程語言。要充分利用單線程執(zhí)行的優(yōu)勢(shì),我們可以使用AsyncIO庫。
異步代碼顧名思義,AsyncIO在Python中提供了異步執(zhí)行。異步代碼以非阻塞的方式運(yùn)行。如果一個(gè)函數(shù)等待時(shí)間較長,可以在等待期間執(zhí)行另一個(gè)任務(wù),而不是將所有任務(wù)都暫停。
下面的圖像進(jìn)一步說明了同步與異步代碼執(zhí)行的區(qū)別。在等待第一個(gè)響應(yīng)時(shí),我們可以發(fā)出第二個(gè)請(qǐng)求以更好地利用處理能力。
盡管它不使用多線程,但它確實(shí)執(zhí)行代碼的并發(fā)執(zhí)行,并且在許多情況下大大減少了等待時(shí)間。
使用AsyncIOAsyncIO庫有兩個(gè)重要的關(guān)鍵字:
- async
- await 我們可以使用async def關(guān)鍵字來定義協(xié)程。 await關(guān)鍵字用在異步協(xié)程內(nèi),表示程序應(yīng)該在此等待并同時(shí)執(zhí)行其他操作。
看一下下面的代碼示例:
import asyncio
async def co_routine(num):print('進(jìn)入?yún)f(xié)程編號(hào):', num)await asyncio.sleep(2)print('退出協(xié)程編號(hào):', num)
async def main():await asyncio.gather(co_routine(1),co_routine(2),co_routine(3))
asyncio.run(main())以下是輸出結(jié)果!進(jìn)入?yún)f(xié)程編號(hào):
1進(jìn)入?yún)f(xié)程編號(hào): 2進(jìn)入?yún)f(xié)程編號(hào): 3退出協(xié)程編號(hào): 1退出協(xié)程編號(hào): 2退出協(xié)程編號(hào): 3正如您所見,我們?cè)诶^續(xù)執(zhí)行協(xié)程2和3之前,不需要等待協(xié)程1完成執(zhí)行。
讓我們逐步看一下代碼。import asyncio這樣導(dǎo)入asyncio庫到您的Python代碼中。async def co_routine(num):print('進(jìn)入?yún)f(xié)程編號(hào):', num)await asyncio.sleep(2)print('退出協(xié)程編號(hào):', num)這是我們的異步協(xié)程。我們使用async def關(guān)鍵字來定義它。我們?cè)谶M(jìn)入時(shí)打印一條消息,然后協(xié)程休眠2秒。這里發(fā)生了魔法。await關(guān)鍵字表示我們必須等待,因此程序可以執(zhí)行其他操作。await關(guān)鍵字只能在異步協(xié)程內(nèi)使用!async def main():await asyncio.gather(co_routine(1),co_routine(2),co_routine(3))這定義了我們的異步主程序。asyncio.gather接受多個(gè)協(xié)程調(diào)用,并在它們并發(fā)執(zhí)行后返回。這里,我們運(yùn)行了值為1、2和3的協(xié)程。由于我們必須使用await關(guān)鍵字,所以我們的主程序也被定義為async。
但是,對(duì)于最終的調(diào)用,我們可以使用asyncio.run。asyncio.run(main())這將執(zhí)行我們的主程序,而無需使用await。
現(xiàn)在,您可以在希望并發(fā)運(yùn)行的程序中使用async/await。