Process 是電腦中已執行 Program 的實體 每一個 Process 是互相獨立的 同一個 Process 中會有很多個 Thread ,每一個 Thread 負責某一項功能 同一個 Process 底下的 Thread 共享資源,如 記憶體、變數等
在多執行緒中(Multithreading),執行緒屬於同步機制,在同時間運行的執行緒,若兩個執行緒若同時存取或改變全域變數(Global Variable),則可能發生同步(Synchronization)問題。若執行緒之間互搶資源,則可能產生死結(Deadlock)
Coroutine的程式概念, 在1958年由Melvin Edward Conway提出, 是一種類似多執行緒的單執行緒程式概念, 且可以避開多執行緒的race condition問題, 因為他是單執行緒!!!, 所以不會有第二個執行緒來搶著操作.
Coroutine Coroutine 屬於非同步機制,在執行過程擁有自己的上下文,同時具有可暫時儲存上下文的機制,當一個 Coroutine 儲存後,執行完其他任務可在重新進入,並且從上一次執行的狀態繼續進行。這樣的功能讓程式可以達到分段執行。
同執行緒的比較 協程非常類似於執行緒。但是協程是協同運作式多工的,而執行緒典型是搶占式多工的。這意味著協程提供並行性而非並列性。協程超過執行緒的好處是它們可以用於硬性即時的語境(在協程之間的切換不需要涉及任何系統呼叫或任何阻塞呼叫),這裡不需要用來守衛關鍵區段的同步性原語(primitive)比如互斥鎖、號誌等,並且不需要來自作業系統的支援。有可能以一種對呼叫代碼透明的方式,使用搶占式排程的執行緒實現協程,但是會失去某些利益(特別是對硬性即時操作的適合性和相對廉價的相互之間切換)。
Yield Yield 又稱為生成器,也叫作「半協程」,屬於協程的子集。他跟 Coroutine 一樣,都可以分段執行,但兩者還是有差別。首先,Coroutine 可以控制接續執行另一個協成,過某一段時間再切回繼續跑。Yield 只能在呼叫時,被呼叫的對象控制,並且只能在該Yield ,無法跳到其他 Coroutine 。但事實並非這麼絕對,其實可透過一些dispatcher 的模式來透過上層以token等方式控制yield,在邏輯上達到切換到其他 Coroutine 。