前言
今天我們來聊聊Python協(xié)程臀晃,當(dāng)Python學(xué)習(xí)到一定的深度,當(dāng)你需要對代碼進(jìn)行優(yōu)化提速時,就避不開異步編程雷绢,尤其是現(xiàn)在優(yōu)秀的第三方庫都實現(xiàn)了異步編程,這使得我們不得不學(xué)習(xí)理卑。
本人也是最近開始學(xué)習(xí)這個概念翘紊,本次分享我們就來簡單聊聊Python協(xié)程的概念和最基本的語法。
什么是協(xié)程
我們先來看看協(xié)程的概念藐唠。
協(xié)程(Coroutine)帆疟,也可以被稱為微線程,是一種用戶態(tài)內(nèi)的上下文切換技術(shù)宇立。
概念是不是很不好理解踪宠,沒關(guān)系,我們引入一個小學(xué)就學(xué)過的數(shù)學(xué)思考題妈嘹。小明早上起床需要刷牙和燒水柳琢,刷牙需要5分鐘,燒水需要8分鐘润脸,問小明總共需要幾分鐘完成這兩件事情柬脸。
答案是8分鐘,這你應(yīng)該是知道的吧毙驯。其實這就是協(xié)程倒堕,現(xiàn)在我再來解釋下,刷牙是一個函數(shù)爆价,燒水時一個函數(shù)垦巴,那協(xié)程就是通過一個線程實現(xiàn)代碼塊相互切換執(zhí)行。
Python實現(xiàn)協(xié)程
我們首先來看看不用協(xié)程怎么來寫允坚。
import time
def brush_teeth():
print('開始刷牙')
time.sleep(5)
print('刷牙完成')
def boil_water():
print('開始燒水')
time.sleep(8)
print('燒水完成')
def main():
start = time.time()
brush_teeth()
boil_water()
end = time.time()
print('花費(fèi)時間{}s'.format(end-start))
main()
開始刷牙
刷牙完成
開始燒水
燒水完成
花費(fèi)時間13.01053786277771s
看到?jīng)]魂那,需要13s,那我們來看看協(xié)程怎么寫稠项。
import asyncio
import time
async def brush_teeth():
print('開始刷牙')
await asyncio.sleep(5)
print('刷牙完成')
async def boil_water():
print('開始燒水')
await asyncio.sleep(8)
print('燒水完成')
async def main():
start = time.time()
tasks = [
asyncio.create_task(boil_water()),
asyncio.create_task(brush_teeth())
]
await asyncio.wait(tasks)
end = time.time()
print('花費(fèi)時間{}s'.format(end-start))
asyncio.run(main())
開始燒水
開始刷牙
刷牙完成
燒水完成
花費(fèi)時間8.004523992538452s
用了協(xié)程后涯雅,程序就只需要8s了。所以協(xié)程很有用展运,協(xié)程一般應(yīng)用在有IO操作的程序中活逆,因為協(xié)程可以利用IO等待的時間去執(zhí)行一些其他的代碼精刷,從而提升代碼執(zhí)行效率。
代碼解釋
最好蔗候,我們來解釋一下代碼怒允。
(1)asyncio.run(main()),進(jìn)入main函數(shù)锈遥,事件循環(huán)開始纫事。
這里有必要解釋一下事件循環(huán),事件循環(huán)可以看做成while循環(huán)所灸,一直循環(huán)著任務(wù)丽惶,當(dāng)任務(wù)完成時苛骨,才會終止循環(huán)券盅。
(2)tasks列表里面就創(chuàng)建了兩個任務(wù),這兩個任務(wù)就進(jìn)入到了事件循環(huán)偏化,準(zhǔn)備執(zhí)行侠驯。
這里創(chuàng)建的任務(wù)就是協(xié)程對象抡秆,當(dāng)用async關(guān)鍵字定義的函數(shù)就是協(xié)程函數(shù),調(diào)用這個函數(shù)吟策,返回的就是協(xié)程對象儒士。
(3)await asyncio.wait(tasks)就會進(jìn)入任務(wù)中,首先進(jìn)入燒水任務(wù)踊挠,遇到IO(這里是睡眠)乍桂,就跳入到另外一個一個任務(wù)(刷牙),然后又遇到IO效床,這里沒有其他任務(wù)了,所以等待完成刷牙任務(wù)权谁,就跳入到燒水任務(wù)剩檀,完成后,整個事件循環(huán)就結(jié)束了旺芽。
awit關(guān)鍵詞就是等待的意思沪猴,后面接的是IO等待。
今天的分享就到這了采章,如果我的文章對你有幫助运嗜,別忘了點(diǎn)贊,收藏悯舟,轉(zhuǎn)發(fā)担租,這對我有很大的幫助,我們下期再見~