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