1. 協(xié)程的概念
協(xié)程可以理解為線程的微線程,每個(gè)協(xié)程對(duì)應(yīng)一個(gè)可執(zhí)行函數(shù)街佑。
具體解釋可見(jiàn)(14條消息) Python 異步 async/await(進(jìn)階)_零否的博客-CSDN博客_async await python
2. 協(xié)程在python中的實(shí)現(xiàn)
協(xié)程的實(shí)現(xiàn)在python3中可以利用async模塊母廷。
具體代碼如下:
import asyncio # 導(dǎo)入 asyncio庫(kù)
def xiechengTest():
# 第一步骗绕,創(chuàng)建協(xié)程(異步函數(shù))
async def fun1(): # 異步函數(shù)相較普通函數(shù)定義前面多了async
await asyncio.sleep(3) # 通過(guò)await聲明一個(gè)可等待對(duì)象筹煮,比如異步函數(shù)或awaitable類的實(shí)例
print("fun1執(zhí)行完畢")
async def fun2():
await asyncio.sleep(1)
print("fun2執(zhí)行完畢")
# 第二步,建立事件循環(huán)移迫,建立事件循環(huán)包含以下幾步
# 1. 創(chuàng)建一個(gè)事件循環(huán)
loop = asyncio.get_event_loop()
# 2. 將異步函數(shù)加入事件隊(duì)列
tasks = [
fun1(),
fun2(),
]
# 3. 執(zhí)行事件隊(duì)列, 直到最晚的一個(gè)事件被處理完畢后結(jié)束
loop.run_until_complete(asyncio.wait(tasks))
# 4. 用 close() 方法關(guān)閉事件循環(huán), 以徹底清理 loop 對(duì)象防止誤用
loop.close()
if __name__ == "__main__":
xiechengTest()
3. 創(chuàng)建協(xié)程的好處
最直觀的優(yōu)點(diǎn)就是充分利用CPU粟誓,節(jié)省程序運(yùn)行時(shí)間。在上面主程序中稍作修改起意,可以計(jì)算出該程序的運(yùn)行時(shí)間:
if __name__ == "__main__":
import time
start = time.time()
xiechengTest()
end = time.time()
print(f"程序運(yùn)行時(shí)間為{end - start}")
運(yùn)行結(jié)果如下:
>>> fun2執(zhí)行完畢
>>> fun1執(zhí)行完畢
>>> 程序運(yùn)行時(shí)間為3.0134615898132324
可以看到整個(gè)程序運(yùn)行時(shí)間僅比單獨(dú)執(zhí)行fun1()函數(shù)的時(shí)間多了一點(diǎn)點(diǎn),這說(shuō)明fun2()執(zhí)行時(shí)fun()1也在同步執(zhí)行病瞳,多出來(lái)的那點(diǎn)時(shí)間是線程切換導(dǎo)致的揽咕。