衆所周知 ,多線程除了會給cpu帶來切換上下文的開銷,還會產生資源競爭,想要用多線程,免不了這裏那裏加個鎖。
所以多線程在有些時候並不討巧。
所以,協程出現了,他也可以併發的執行多線邏輯,但完全不會給cpu帶來額外負擔,且不存在任何資源競爭。
看起來,協程可以完美替代多線程了。
但其實,協程也只是在特定應用情境下才適用。
使用多線程的目的之一是爲了不阻塞主線程的迭代循環,讓主線程可以順暢運行,而協程的使用目的就只限於此。
那些需要計算,可能在同一幀內做大量運算的事情,就無法靠協程去併發。因爲他們也會加大主線程在一幀內的計算量,一樣會造成卡幀。
所以協程做的基本上是一些檢查工作
檢查一個計時器是否到了指定的時間
檢查一個下載是否已經完成
檢查另一個協程是否結束
甚至什麼不做
更進一步歸納
協程的yield 就相當於 異步函數的await
區別是 yield背後執行的每幀檢查工作在主線程 且每次檢查幾乎不費事
而await 後面跟的是一個Task 一個可能需要花上很久才能結束的多線程任務
(其實,理論上感覺,只要這個task的邏輯可以分成多幀去執行 且可以控制好每幀的計算量
就可以用協程代替他。
當然多核處理的優勢是無論如何都沒法替代的,特別是在將來很有可能普及32線程甚至64線程的產品,
一個協程就想以一敵百嗎,縱使你有百般能耐,也不可能以一敵百....)