send喚醒生成器 yield gevent

協(xié)程

協(xié)程脐湾,又稱微線程,纖程。英文名Coroutine事格。

協(xié)程是啥

協(xié)程是python個(gè)中另外一種實(shí)現(xiàn)多任務(wù)的方式氢卡,只不過(guò)比線程更小占用更小執(zhí)行單元(理解為需要的資源)锈至。 為啥說(shuō)它是一個(gè)執(zhí)行單元,因?yàn)樗詭PU上下文译秦。這樣只要在合適的時(shí)機(jī)峡捡, 我們可以把一個(gè)協(xié)程 切換到另一個(gè)協(xié)程。 只要這個(gè)過(guò)程中保存或恢復(fù) CPU上下文那么程序還是可以運(yùn)行的筑悴。

通俗的理解:在一個(gè)線程中的某個(gè)函數(shù)们拙,可以在任何地方保存當(dāng)前函數(shù)的一些臨時(shí)變量等信息,然后切換到另外一個(gè)函數(shù)中執(zhí)行雷猪,注意不是通過(guò)調(diào)用函數(shù)的方式做到的睛竣,并且切換的次數(shù)以及什么時(shí)候再切換到原來(lái)的函數(shù)都由開(kāi)發(fā)者自己確定

協(xié)程和線程差異

在實(shí)現(xiàn)多任務(wù)時(shí), 線程切換從系統(tǒng)層面遠(yuǎn)不止保存和恢復(fù) CPU上下文這么簡(jiǎn)單。 操作系統(tǒng)為了程序運(yùn)行的高效性每個(gè)線程都有自己緩存Cache等等數(shù)據(jù)求摇,操作系統(tǒng)還會(huì)幫你做這些數(shù)據(jù)的恢復(fù)操作射沟。 所以線程的切換非常耗性能。但是協(xié)程的切換只是單純的操作CPU的上下文与境,所以一秒鐘切換個(gè)上百萬(wàn)次系統(tǒng)都抗的住验夯。

簡(jiǎn)單實(shí)現(xiàn)協(xié)程

importtimedefwork1():whileTrue:? ? ? ? print("----work1---")yieldtime.sleep(0.5)defwork2():whileTrue:? ? ? ? print("----work2---")yieldtime.sleep(0.5)defmain():w1 = work1()? ? w2 = work2()whileTrue:? ? ? ? next(w1)? ? ? ? next(w2)if__name__ =="__main__":? ? main()

運(yùn)行結(jié)果:

----work1---

----work2---

----work1---

----work2---

----work1---

----work2---

......

greenlet

為了更好使用協(xié)程來(lái)完成多任務(wù),python中的greenlet模塊對(duì)其封裝摔刁,從而使得切換任務(wù)變的更加簡(jiǎn)單

安裝方式

使用如下命令安裝greenlet模塊:

sudo pip3 install greenlet

#coding=utf-8fromgreenletimportgreenletimporttimedeftest1():whileTrue:print"---A--"gr2.switch()? ? ? ? time.sleep(0.5)deftest2():whileTrue:print"---B--"gr1.switch()? ? ? ? time.sleep(0.5)gr1 = greenlet(test1)gr2 = greenlet(test2)#切換到gr1中運(yùn)行g(shù)r1.switch()

運(yùn)行效果

---A--

---B--

---A--

---B--

......

gevent

greenlet已經(jīng)實(shí)現(xiàn)了協(xié)程挥转,但是這個(gè)還的人工切換,是不是覺(jué)得太麻煩了共屈,不要捉急绑谣,python還有一個(gè)比greenlet更強(qiáng)大的并且能夠自動(dòng)切換任務(wù)的模塊gevent

其原理是當(dāng)一個(gè)greenlet遇到IO(指的是input output 輸入輸出,比如網(wǎng)絡(luò)拗引、文件操作等)操作時(shí)借宵,比如訪問(wèn)網(wǎng)絡(luò),就自動(dòng)切換到其他的greenlet矾削,等到IO操作完成壤玫,再在適當(dāng)?shù)臅r(shí)候切換回來(lái)繼續(xù)執(zhí)行豁护。

由于IO操作非常耗時(shí),經(jīng)常使程序處于等待狀態(tài)欲间,有了gevent為我們自動(dòng)切換協(xié)程楚里,就保證總有g(shù)reenlet在運(yùn)行,而不是等待IO

安裝

pip3 install gevent

1. gevent的使用

importgeventdeff(n):foriinrange(n):? ? ? ? print(gevent.getcurrent(), i)g1 = gevent.spawn(f,5)g2 = gevent.spawn(f,5)g3 = gevent.spawn(f,5)g1.join()g2.join()g3.join()

運(yùn)行結(jié)果

012340123401234

可以看到猎贴,3個(gè)greenlet是依次運(yùn)行而不是交替運(yùn)行

2. gevent切換執(zhí)行

importgeventdeff(n):foriinrange(n):? ? ? ? print(gevent.getcurrent(), i)#用來(lái)模擬一個(gè)耗時(shí)操作班缎,注意不是time模塊中的sleepgevent.sleep(1)g1 = gevent.spawn(f,5)g2 = gevent.spawn(f,5)g3 = gevent.spawn(f,5)g1.join()g2.join()g3.join()

運(yùn)行結(jié)果

000111222333444

3. 給程序打補(bǔ)丁

fromgeventimportmonkeyimportgeventimportrandomimporttimedefcoroutine_work(coroutine_name):foriinrange(10):? ? ? ? print(coroutine_name, i)? ? ? ? time.sleep(random.random())gevent.joinall([? ? ? ? gevent.spawn(coroutine_work,"work1"),? ? ? ? gevent.spawn(coroutine_work,"work2")])

運(yùn)行結(jié)果

work10work11work12work13work14work15work16work17work18work19work20work21work22work23work24work25work26work27work28work29

fromgeventimportmonkeyimportgeventimportrandomimporttime# 有耗時(shí)操作時(shí)需要monkey.patch_all()# 將程序中用到的耗時(shí)操作的代碼,換為gevent中自己實(shí)現(xiàn)的模塊defcoroutine_work(coroutine_name):foriinrange(10):? ? ? ? print(coroutine_name, i)? ? ? ? time.sleep(random.random())gevent.joinall([? ? ? ? gevent.spawn(coroutine_work,"work1"),? ? ? ? gevent.spawn(coroutine_work,"work2")])

運(yùn)行結(jié)果

work10work20work11work12work13work21work14work22work15work23work16work17work18work24work25work19work26work27work28work29

進(jìn)程嘱能、線程吝梅、協(xié)程對(duì)比

簡(jiǎn)單總結(jié)

進(jìn)程是資源分配的單位

線程是操作系統(tǒng)調(diào)度的單位

進(jìn)程切換需要的資源很最大,效率很低

線程切換需要的資源一般惹骂,效率一般(當(dāng)然了在不考慮GIL的情況下)

協(xié)程切換任務(wù)資源很小苏携,效率高

多進(jìn)程、多線程根據(jù)cpu核數(shù)不一樣可能是并行的对粪,但是協(xié)程是在一個(gè)線程中 所以是并發(fā)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末右冻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子著拭,更是在濱河造成了極大的恐慌纱扭,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儡遮,死亡現(xiàn)場(chǎng)離奇詭異乳蛾,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鄙币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門肃叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人十嘿,你說(shuō)我怎么就攤上這事因惭。” “怎么了绩衷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蹦魔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我咳燕,道長(zhǎng)勿决,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任招盲,我火速辦了婚禮剥险,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宪肖。我一直安慰自己表制,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布控乾。 她就那樣靜靜地躺著么介,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜕衡。 梳的紋絲不亂的頭發(fā)上壤短,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天,我揣著相機(jī)與錄音慨仿,去河邊找鬼久脯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镰吆,可吹牛的內(nèi)容都是我干的帘撰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼万皿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摧找!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起牢硅,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹬耘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后减余,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體综苔,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年位岔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了如筛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赃承,死狀恐怖妙黍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞧剖,我是刑警寧澤拭嫁,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抓于,受9級(jí)特大地震影響做粤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜捉撮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一怕品、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巾遭,春花似錦肉康、人聲如沸闯估。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涨薪。三九已至,卻和暖如春炫乓,著一層夾襖步出監(jiān)牢的瞬間刚夺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工末捣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侠姑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓箩做,卻偏偏與公主長(zhǎng)得像莽红,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子卒茬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

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

  • 協(xié)程 協(xié)程捌锭,又稱微線程俘陷,纖程。英文名Coroutine观谦。 協(xié)程是啥 協(xié)程是python個(gè)中另外一種實(shí)現(xiàn)多任務(wù)的方式...
    關(guān)若飛閱讀 164評(píng)論 0 0
  • 協(xié)程 閱讀目錄 一 引子 二 協(xié)程介紹 三 Greenlet模塊 四 Gevent模塊 引子 之前我們學(xué)習(xí)了線程豁状、...
    go以恒閱讀 708評(píng)論 0 1
  • 迭代捉偏、迭代器、生成器泻红、協(xié)程夭禽、yield、greenlet谊路、gevent讹躯、進(jìn)程線程協(xié)程對(duì)比、gevent多任務(wù)圖片下...
    Cestine閱讀 489評(píng)論 0 0
  • 一、總體內(nèi)容 1.1潮梯、協(xié)程的介紹 1.2骗灶、迭代器以及迭代器的應(yīng)用 1.3、生成器(生成器與迭代器保存的都是生成數(shù)據(jù)...
    IIronMan閱讀 861評(píng)論 0 1
  • greenlet 為了更好使用協(xié)程來(lái)完成多任務(wù)秉馏,python中的greenlet模塊對(duì)其封裝矿卑,從而使得切換任務(wù)變的...
    冰鈊夢(mèng)閱讀 97評(píng)論 0 0