標籤:

協程和纖程的區別?

哪位能夠詳細說明協程和纖程的區別?或者說兩種等同的依據

協程是語言級別的特性,不會像操作系統線程調度損耗大,這個不是問題重點。重點是有的地方有纖程的概念,它與協程的區別是什麼?這是關鍵


強答:

協程是自己主動停下來,然後由調度器觸發恢復執行

纖程是由調度者暫停調度,調度者繼續調度

協程只能在確定的位置停下來,比如yield return,await等

纖程能停在任何位置

協程有stackless的實現,可以不依賴運行時,完全做成語法糖

線程是操作系統提供的機制


#ifdef 微軟大法好
#define 纖程 協程
#endif

Is there a difference between fibers, coroutines and green threads and if that is so what is it?


協程看上去也是子程序,但執行過程中,在子程序內部可中斷,然後轉而執行別的子程序,在適當的時候再返回來接著執行。

def A():
print "1"
print "2"
print "3"

def B():
print "x"
print "y"
print "z"

假設由協程執行,在執行A的過程中,可以隨時中斷,去執行B,B也可能在執行過程中中斷再去執行A,結果可能是:

1
2
x
y
3
z

但是在A中是沒有調用B的,所以協程的調用比函數調用理解起來要難一些。

但協程的特點在於是一個線程執行,卻可以實現不同函數之間的切換。

參考:協程 - 廖雪峰的官方網站


微軟叫 纖程 其實是一個東西


協程,又稱微線程,纖程。英文名Coroutine。


你好和雷猴的區別


纖程就是協程。稍微看了下windows下纖程,也就是fiber的API,其中一個比較典型的API是SwitchToFiber,指定切換到某個纖程上。

這個和典型的C++協程庫如雲風的coroutine,微信的libev不同,後者只需要調用yield,將切換過程交由主調度器進行,主調度器會選擇一個協程進行切換。而協程內部並不能切換到指定的某個協程上。

這是協程的兩種形式而已,fiber的這種被稱為對稱協程,coroutine和libev則是非對稱協程。

話說起來,fiber這種對稱協程好處在於程序員可嚴格對數據流進行控制,可以用來做狀態機之類的東西


纖程是Windows系統級別上支持的樸素協程。

協程是從執行目的來定義的概念,但是不規定用什麼方式實現。而纖程是具體系統對象的名字,可以說從系統原生提供了協程的底層實現。協程這東西,微軟一直都有,還記得大明湖畔的VB6嗎?它的DoEvents函數,可以把線程擁有權暫時交出,還有Enumer枚舉介面,就是個協程,微軟命名部宕機了而已。


用戶態線程,沒有上下文切換,能夠被阻塞。


強答一波。

沒有區別。


推薦閱讀:

Gevent的協程,能夠非同步是為什麼呢?
關於go語言協程調度的一個問題(具體請看問題描述)?

TAG:協程 |