咱們一塊兒來學lua:協程(coroutine) 一

相同點:
協程跟線程很接近,可是又有區別,咱們先來看看協程跟線程同樣的地方:函數運行時都會開闢本身的獨立棧,局部變量和PC計數器,同時又與其餘協程共享全局變量和其餘大部分東西,這一點是否是跟線程很像?
不一樣點:
協程和線程最主要的區別在於:多個線程能夠一塊兒跑,他們能夠共同去競爭cpu,也就是說多個線程是能夠同時並行運行的。而協程就不同了,多協程的話,只有一個協程在跑,其餘協程就必須在那裏等着,只有正在跑的協程主動掛起或者運行結束的時候,才輪到其餘協程工做。
我在其餘技術文章裏面有看到,有做者提到「**多協程程序在同一時間只能運行一個協程**」把這個做爲協程和線程的區別了。其實我不太同意這樣的觀點,可能做者本意不是這樣的。可是容易引發歧義。怎麼說呢,在同一時間其實真正在跑的線程也就僅僅只有一個,不可能有兩個線程同時跑的。因此同一時間可以運行的協程和線程都是同樣的,都只有一個在跑。那他們的真正區別是什麼呢?這裏可能須要引入cpu輪轉搶佔去說明可能更合適一些。稍微懂點操做系統的童鞋應該都知道。cpu會有一個時間片,每個時間內都只會有一個線程在運行,其餘線程都會放在等待隊列裏面,等待翻牌子。當這個時間片時間一結束,正在運行的線程就會從cpu這個皇帝的牀上退出來,退回到其餘線程的等待隊列中,從新競選翻牌子,皇帝翻到誰的牌子,哪一個線程就可以跟cpu寵幸,而後等到時間片時間到了,新的一輪翻牌子又要開始了。。。
協程這個妃子就不同了,她但是有脾氣的。皇帝你翻我牌子了,就要跟妃子我好好過,我沒休息沒來大姨媽以前,都不準皇帝碰其餘妃子,就算時間片時間到了,也不容許換妃子。。。嗯,就是這麼有個性~~~~
舉了個皇帝翻牌子的例子,不知道你們有沒有看懂呢?
性能對比:
協程是在純用戶態下執行的,它的建立和切換的開銷,要遠遠小於線程。因此單從性能上來說協程是要優於線程的。
結束語:
第一次寫博客,寫的不對的地方,但願你們可以指正,下一期咱們就來說下協程的具體用法,敬請期待~~~~
相關文章
相關標籤/搜索