簡單聊聊Python協(xié)程

前言

今天我們來聊聊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ā)担租,這對我有很大的幫助,我們下期再見~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抵怎,一起剝皮案震驚了整個濱河市奋救,隨后出現(xiàn)的幾起案子岭参,更是在濱河造成了極大的恐慌,老刑警劉巖尝艘,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件演侯,死亡現(xiàn)場離奇詭異,居然都是意外死亡背亥,警方通過查閱死者的電腦和手機(jī)秒际,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡汉,“玉大人娄徊,你說我怎么就攤上這事≈崃裕” “怎么了嵌莉?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捻脖。 經(jīng)常有香客問我锐峭,道長,這世上最難降的妖魔是什么可婶? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任沿癞,我火速辦了婚禮,結(jié)果婚禮上矛渴,老公的妹妹穿的比我還像新娘椎扬。我一直安慰自己,他們只是感情好具温,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布蚕涤。 她就那樣靜靜地躺著,像睡著了一般铣猩。 火紅的嫁衣襯著肌膚如雪揖铜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天达皿,我揣著相機(jī)與錄音天吓,去河邊找鬼。 笑死峦椰,一個胖子當(dāng)著我的面吹牛龄寞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汤功,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼物邑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起拂封,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤茬射,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后冒签,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體在抛,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年萧恕,在試婚紗的時候發(fā)現(xiàn)自己被綠了刚梭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡票唆,死狀恐怖朴读,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情走趋,我是刑警寧澤衅金,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站簿煌,受9級特大地震影響氮唯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姨伟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一惩琉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夺荒,春花似錦瞒渠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剿吻,卻和暖如春私沮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背和橙。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留造垛,地道東北人魔招。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像五辽,于是被迫代替她去往敵國和親办斑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容