day40-并發(fā)編程之協(xié)程

一、協(xié)程

  1. 并發(fā):同一時間段內(nèi),多個任務(wù)執(zhí)行(單核CPU可以實現(xiàn))。
  2. 并行:同一時刻虱饿,多個任務(wù)執(zhí)行(只能多核)

協(xié)程是程序員臆想出來的單線程實現(xiàn)并發(fā),在應(yīng)用程序里控制多個任務(wù)的切換+保存狀態(tài)触趴。
yield:生成器氮发,只要函數(shù)中有yield關(guān)鍵字,這個函數(shù)就是生成器冗懦,通過yield可以實現(xiàn)保存狀態(tài)+切換

  • 協(xié)程的優(yōu)點:協(xié)程的切換開銷更小爽冕,屬于程序級別的切換,操作系統(tǒng)完全感知不到披蕉,因而更加輕量級颈畸;單線程內(nèi)就可以實現(xiàn)并發(fā)的效果,最大限度地利用cpu没讲。
  • 協(xié)程的缺點:多個任務(wù)一旦有一個阻塞沒有切眯娱,整個線程都阻塞在原地
    該線程內(nèi)的其他的任務(wù)都不能執(zhí)行了。

一旦引入?yún)f(xié)程爬凑,就需要檢測單線程下所有的IO行為,實現(xiàn)遇到IO就切換,少一個都不行徙缴,以為一旦一個任務(wù)阻塞了,整個線程就阻塞了嘁信,其他的任務(wù)即便是可以計算娜搂,但是也無法運(yùn)行了迁霎。

二吱抚、greenlet模塊

greenlet模塊遇到IO不會切換

from greenlet import greenlet
import time
# 遇到io不會切百宇,初級模塊,gevent模塊基于它寫的秘豹,處理io切換
def eat():
    print('我吃了一口')
    p.switch()
    print('我又吃了一口')
    p.switch()


def play():
    print('我玩了一會')
    e.switch()
    print('我又玩了一會')


if __name__ == '__main__':
    e = greenlet(eat)
    p = greenlet(play)
    e.switch()

三携御、gevent模塊

使用gevent庫需要先安裝:

#安裝
pip3 install gevent

Gevent 是一個第三方庫,可以輕松通過gevent實現(xiàn)并發(fā)同步或異步編程既绕,在gevent中用到的主要模式是Greenlet, 它是以C擴(kuò)展模塊形式接入Python的輕量級協(xié)程啄刹。 Greenlet全部運(yùn)行在主程序操作系統(tǒng)進(jìn)程的內(nèi)部,但它們被協(xié)作式地調(diào)度凄贩。

用法

import gevent
import time

def eat(name):
    print('%s 吃了一口' % name)
    gevent.sleep(1)
    print('%s 又吃了一口' % name)


def play(name):
    print('%s 玩了一會' % name)
    gevent.sleep(2)
    print('%s 又玩了一會' % name)


if __name__ == '__main__':
    ctim = time.time()
    e = gevent.spawn(eat,'lqz')
    p = gevent.spawn(play,'lqz')
    e.join() # 等待e執(zhí)行完成
    p.join()
    print('主')
    print(time.time() - ctim)  #2.0165154933929443

四誓军、asyncio

# 官方支持協(xié)程的庫



# import time
# import asyncio
#
# # 把普通函數(shù)變成協(xié)程函數(shù)
# # 3.5以前這么寫
# @asyncio.coroutine
# def task():
#     print('開始了')
#     yield from asyncio.sleep(1)  #asyncio.sleep(1)模擬io
#     print('結(jié)束了')
#
#
# loop=asyncio.get_event_loop()  # 獲取一個時間循環(huán)對象#
#
# # 協(xié)程函數(shù)加括號,并不會真正的去執(zhí)行疲扎,它需要提交給loop昵时,讓loop循環(huán)著去執(zhí)行
# # 協(xié)程函數(shù)列表
#
# ctime=time.time()
# t=[task(),task()]
# loop.run_until_complete(asyncio.wait(t))
# loop.close()
# print(time.time()-ctime)


import time
import asyncio
from threading import current_thread
# 表示我是協(xié)程函數(shù),等同于3.5之前的裝飾器
async def task():
    print('開始了')
    print(current_thread().name)
    await asyncio.sleep(3)  # await等同于原來的yield from
    print('結(jié)束了')

async def task2():
    print('開始了')
    print(current_thread().name)
    await asyncio.sleep(2)
    print('結(jié)束了')

loop=asyncio.get_event_loop()

ctime=time.time()
t=[task(),task2()]
loop.run_until_complete(asyncio.wait(t))
loop.close()
print(time.time()-ctime)

五、io模型

點擊進(jìn)入……

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椒丧,一起剝皮案震驚了整個濱河市壹甥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌壶熏,老刑警劉巖句柠,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異棒假,居然都是意外死亡溯职,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門帽哑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谜酒,“玉大人,你說我怎么就攤上這事祝拯∩醮” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵佳头,是天一觀的道長鹰贵。 經(jīng)常有香客問我,道長康嘉,這世上最難降的妖魔是什么碉输? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮亭珍,結(jié)果婚禮上敷钾,老公的妹妹穿的比我還像新娘枝哄。我一直安慰自己,他們只是感情好阻荒,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布挠锥。 她就那樣靜靜地躺著,像睡著了一般侨赡。 火紅的嫁衣襯著肌膚如雪蓖租。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天羊壹,我揣著相機(jī)與錄音蓖宦,去河邊找鬼。 笑死油猫,一個胖子當(dāng)著我的面吹牛稠茂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播情妖,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼睬关,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲫售?” 一聲冷哼從身側(cè)響起共螺,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎情竹,沒想到半個月后藐不,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡秦效,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年雏蛮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阱州。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡挑秉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苔货,到底是詐尸還是另有隱情犀概,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布夜惭,位于F島的核電站姻灶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏诈茧。R本人自食惡果不足惜产喉,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曾沈,春花似錦这嚣、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敛腌,卻和暖如春卧土,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背像樊。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留旅敷,地道東北人生棍。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像媳谁,于是被迫代替她去往敵國和親涂滴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355