Python-協(xié)程

突然簡書就不支持使用markdown語法自己編輯了,而是和word一樣自己選擇要樣式化的文本,實在是令人很不習慣,準備搭建一個Github主頁算了。

使用協(xié)程的一個典型例子是生產(chǎn)者消費者模型。我感慨道,果然什么語言不重要啊,思想都是一致的,想起LabVIEW當時用這個生產(chǎn)者消費者用的順風順水,因為實在是太好用了,當時編寫的每一個系統(tǒng)都嘗試使用生產(chǎn)者消費者,特別是與用戶交互的界面中,用這個模型簡直極大的優(yōu)化用戶的點擊體驗。當時是使用隊列來實現(xiàn)狀態(tài)的轉移,從生產(chǎn)者轉移到消費者循環(huán)里面進行處理。

今天使用Python來實現(xiàn)一個簡單的生產(chǎn)者消費者模型,主要是為了學習協(xié)程這個東西,因為Python其實是不支持多線程并行運算,它的多線程其實也是串行的。協(xié)程是協(xié)作式調(diào)度,大概就是一種可控制的回調(diào),使用yield來實現(xiàn)。

主要思想就是用yield來暫停當前的程序或者循環(huán),然后轉而執(zhí)行另外一個,再在恰當?shù)臅r候回來執(zhí)行。其實本質(zhì)上和LabVIEW的生產(chǎn)者消費者有所不同,因為LabVIEW中是支持多線程的,所以生產(chǎn)者消費者是處于兩個線程來執(zhí)行的兩個循環(huán),因此才使用了隊列數(shù)據(jù)結構來轉移狀態(tài)。

下面是一個簡單的生產(chǎn)者消費者模型:

def consumer():
    n = 0
    print("consumer init")
    while True:
          #在這里將函數(shù)暫停掉,直到另外地方對函數(shù)進行迭代,如producer函數(shù)
          n = yield n
          if not n:
              return
          n -= 1
          print("consume 1, remain %d" %n)
def producer(c):
    n = 0
    next(c)
    while n < 6:
        n += 2
        print("produce 2, total %d " %n)
        #send給generator的value會成為當前yield的結果 并且send的返回結果是下一個yield的結果
        #也就是這里send了2,那邊n的值就是2,然后減一,然后直到再運行到y(tǒng)ield時候,這里返回的是1
        n = c.send(n)
        print("remain %d"%n)
    c.close()
c = consumer()
producer(c)```
producer和consumer協(xié)同合作,在一個線程中運行,不需要鎖,所以就不會出現(xiàn)死鎖。

另外使用協(xié)程也可以來定義一個可以訪問其他環(huán)境的回調(diào)函數(shù)

首先定義一個回調(diào)函數(shù)

def apply_async(func,args,,callback):
#callback是一個強制關鍵字參數(shù)
result = func(*args)
callback(result)
def add(x,y):
return x + y

這個回調(diào)函數(shù)其實就類似于一個消費者

def make_handler():
sequence = 0
while True:
#產(chǎn)生中斷
result = yield
sequence += 1
print("[{}] Got : {}".format(sequence,result))
handler = make_handler()

啟動生成器

next(handler)
apply_async(add,(2,3),callback=handler.send)
apply_async(add,("hello ","world"),callback=handler.send)```

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

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