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