先來看一下Wiki上關於Coroutine的解釋:
Coroutines are computer program components that generalize subroutines for non-preemptive multitasking (協同運作多工), by allowing execution to be suspended and resumed.
簡單來說,Coroutine就是一個可以暫時中斷(suspend)
之後再繼續執性(resumed)
的程序,並且可以多次的進行這樣的切換。如下圖所示
圖出處: 淺談coroutine與gevent
Coroutine 與 Process/Thread
說到這可能會有人問,他與Process/Thread差在哪?
搶佔式多工(Preemptive multitasking )/協同式多工(Non-preemptive multitasking)
Thread: 搶佔式多工
程式會"定期"放棄已佔有的執行資源,讓其他程式可以執行。
Coroutine: 協同式多工
程式有各自的優先權,作業系統會去排成。
上下文切換(Context switch)
Process/Thread
: 是透過OS/thread library來排程(Scheduling)
決定是否進行上下文切換Coroutine
: 由應用程式來做排程
Process/Thread: 執行結果不可預期 Coroutine: 執行結果可預期
Coroutine is Micro-Thread/Light-weight Thread
Coroutine其實就是在單一Thread裡不同的Coroutine之間互相切換,本質上和Thread很像,所以也有些Coroutine叫做
微執行緒(Micro-Thread)
或是輕量化的執行緒(Light-weight Thread)
。切換成本
Coroutine之間切換的成本比Thread低。因為Coroutine的切換是由現在正在執行的Coroutine
主動
讓出執行權的(藉此可以達到並行(concurrency)
運做)。Call Stack
跟Process/Thread一樣,每個
coroutine也有自己的call stack
,由應用程式決定何時suspend/resumed。Race Conditions
跟Process/Thread一樣,Coroutine也會有
Race Conditions
的問題。Process/Thread
適合CPU bound
的程式,Coroutine
適合I/O bound
的程式。
Coroutine 常見用例
Coroutine 與 Concurrency
Concurrency (並行):
同一時間能完成很多事情
Coroutine (協程):
可以中斷及繼續執行的程序,會主動讓執行權。
藉由Coroutine的suspend/resumed特性,我們可以達到邏輯上的並行(Concurrency)。
於是我們可以用Coroutine實現出Concurrency程式。
Concurrency的實現方法
除了用Coroutine實現Concurrency以外,我們也可以用以下方法來實現:
- Multi-threading
- Multi-processing