怎麼理解coroutine ?

時間 2021-06-01 14:37:22

1樓:

協程的概念也許比執行緒、程序還要古老。

協程是協作式多工, 執行緒是搶占式多工。

如果在沒有搶占機制的CPU上(哪怕是嵌入式SoC也會有),只有協程可以實現多工。

協程實現麻煩一點,能在多執行緒上存活的協程更麻煩一點。 記住一點,軟體工程師都是懶的。

2樓:西門笑笑生

談談我的理解:簡單來講coroutine是單執行緒執行的,coroutine是通過函式控制中斷而實現不同的程序非同步操作的;

相對於多執行緒的好處是:執行效率高,沒有多執行緒之間的來回切換;另外不需要多執行緒的鎖機制引數也不會衝突。

一點淺顯的認識,貽笑大方!

3樓:

核心執行緒建立、銷毀、切換成本都比較搞,一般語言中線程阻塞後導致核心執行緒阻塞,及時達到了恢復的條件也要等待下一次CPU排程。coroutine是在語言層面實現的,可以在乙個核心執行緒上去排程多個coroutine,由語言執行時來控制切換,可以更加靈活且切換成本更小。相當於加了一層抽象。

4樓:李自樂

大概是使用者態進行排程的程式片,我重點說下同步實現非同步這個事情。

如果把需要自己從使用者態呼叫io去讀取buffer稱為同步,自己開好buffer讓核心去填充稱為非同步,那麼,執行緒還是協程都無法實現同步方式寫非同步,只能依靠核心提供非同步io函式。

如果僅僅稱不需要一直阻塞到io可讀等事件,等待可讀時可以去呼叫io函式去處理稱為非同步。那麼多執行緒就可以實現了,不論你多少個同步io,開一堆執行緒去做就行了,這樣的同步方式寫非同步,與協程無關,就是執行緒本身的事情。

如果你要說goroutine做了什麼?對於socket io,它呼叫非阻塞io,使用epoll/iocp等迴圈取出ready socket,然後適時喚醒阻塞的goroutine,和直接用多執行緒處理有什麼區別?排程更輕量(不進核心態),啟動銷毀更快。

對於檔案io,是呼叫同步io,長系統呼叫進入前會告訴排程器我要阻塞了,然後新開(也可能只是從池中取)執行緒跑其他goroutine。然後阻塞返回之後把這個阻塞的執行緒搞回全域性(效能可能不怎麼樣...linux的aio太差沒有用非同步,所以只好這樣),把執行緒殺了(或者放入池中)等待以後排程。

5樓:wudaijun

使用者控制切換,自動儲存上下文狀態,切換之間可以通過引數通訊,可用同步的方式實現非同步。這是我理解中的協程最重要的幾個特徵。

6樓:

關於協程,knuth解釋的最簡單明瞭,協程就是多入多出的子例程,另外從字面組成也非常切貼,就是可以協同執行的例程。

協程本身與執行緒沒有關係,只是如果從排程角度來看的話,相當於一種使用者級協作式排程方案(好像windows fiber不完全是協作式的,但我傾向於是協作式才能稱為協程)。至於goroutine,就是相當於把排程本身可以分配到多個執行緒中,或者叫非同步排程。我在自己的實現中稱之為concurrent coroutine(goroutine可能不能這麼叫,已知的協程實現中都不包含真正的並行成分)。

至於還有一些其他概念比如continuation,其實跟協程也沒太大關係,只是continuation可以用於實現協程。這是當然的,誰讓continuation是一切呼叫之母呢(is the mother of all function calls,類似有Continuation monad is the mother of all monads)。也有不基於continuation的實現,比如有人貼出的c實現,是基於duff's devices的跳轉表(狀態機)實現。

也可以把兩者結合起來用。

我實現了乙個還算通用的continuation for c,並在此基礎上實現了完整的concurrent coroutine,可以參考:https://

,目前僅提交了continuation部分,包含乙個closure實現,可以並行呼叫,暫未提交完整的concurrent部分以及event-driven部分。

7樓:zzl0

lz在比較兩個不同級別得概念(coroutine 和多執行緒),可以把 coroutine 看作乙個特殊的函式(參見 Coroutines in C ),雖然 Coroutines 的典型應用場景(要解決的問題)涉及多執行緒和分布式。

從你的解釋,我理解的是coroutine並非是多執行緒的。最近在學習golang,它的goroutine是乙個類似coroutine的實現,但是是乙個多執行緒的實現。所以我對執行緒和coroutine還是覺得有點混亂。

另外,看到lz在 @colaghost 的回答下面問這個問題,其實 goroutine 和 coroutine 不是乙個概念(Is golang goroutine a coroutine?)。現在感覺lz是在問 goroutine 和多執行緒的區別,如果是這樣,也可以參考前面的鏈結。

8樓:codedump

執行緒是作業系統級別的概念,現代作業系統都實現並且支援執行緒,執行緒的排程對應用開發者是透明的,開發者無法預期某執行緒在何時被排程執行。基於此,一般那種隨機出現的BUG,多與執行緒排程相關。

coroutine則是乙個概念,windows上有所謂的fiber纖程實現,而好些語言中也自帶coroutine的實現,比如Lua。與執行緒最大的不同是,coroutine的排程/掛起/執行開發者是可以控制的。另外coroutine也比執行緒輕量的多。

要在語言層面實現coroutine,需要內部有乙個類似棧的資料結構,當該coroutine被掛起時要儲存該coroutine的資料現場以便恢復執行。

goto 和 co routine有什麼區別?

錢念峰 c語言goto只能跳到同函式的標籤吧,longjmp倒是可以,不過跳轉後區域性變數的值是否會恢復呢?棧上的值會恢復,暫存器中的值是否恢復未定義。 東方孤思子 這個問題問得有問題。goto是一種語言機制,協程 coroutine 是一種執行時的一種能力。怎麼會是一回事呢?goto無非是跳轉,目...

怎麼理解

方哥不是噴 是假設,是動作的完成,是表狀態。總起來看就是,假設做完了的話 後面一般程度不是特別高,成了就成了,不成也就不成了,沒什麼大不了的 例句 1.落 落 來年 頑張 落榜就落榜吧,明年努力就是了。2.失敗 失敗 時 考 失敗就失敗吧,到了那時候再考慮吧。我瞎說的 yoyoyozhang 這是一...

怎麼理解陶淵明

陶淵明所處時代動亂不堪,而自己是破落的貴族,不肯因為亂世而放下高貴的身姿,做一些與俗人相同的事以求溫飽。而高貴者表現自己高貴的方式只有乙個,那就是與你們不同。你們勤勤懇懇過日子,我就偏落落魄魄混日子,你們務生存實利,我就偏讀聖賢古書。做乙個小官我當然不滿意了,我原本可是貴族啊,這種小官配得上我嗎,還...