協程和纖程的區別?
哪位能夠詳細說明協程和纖程的區別?或者說兩種等同的依據
協程是語言級別的特性,不會像操作系統線程調度損耗大,這個不是問題重點。重點是有的地方有纖程的概念,它與協程的區別是什麼?這是關鍵
強答:
協程是自己主動停下來,然後由調度器觸發恢復執行
纖程是由調度者暫停調度,調度者繼續調度
協程只能在確定的位置停下來,比如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:協程 |