一、進程、線程催烘、協(xié)程的區(qū)別
- 進程:操作系統(tǒng)中分配資源的基本單位
- 線程:操作系統(tǒng)中調(diào)度資源的基本單位
- 協(xié)程:比線程更小的的執(zhí)行單元瘟判,自帶cpu上下文怨绣,一個協(xié)程一個棧
- 一個進程中可能存在多個線程,一個線程中可能存在多個協(xié)程拷获。
- 進程篮撑、線程的切換由操作系統(tǒng)控制,而協(xié)程的切換由程序員自身控制匆瓜。
- 異步i/o利用回調(diào)的方式來應(yīng)對i/o密集赢笨,同樣的使用協(xié)程也可以來應(yīng)對未蝌,協(xié)程的切換并沒有很大的資源浪費,將
- 一個i/o操作寫成一個協(xié)程茧妒,這樣進行i/o時可以把cpu讓給其他協(xié)程萧吠。
- js同樣支持協(xié)程,那就是yield桐筏。使用yield給我們直觀的感受就是纸型,執(zhí)行到了這個地方停了下來,其他的代碼繼續(xù)跑梅忌,到你想讓他繼續(xù)執(zhí)行了狰腌,他就是會繼續(xù)執(zhí)行。
二牧氮、協(xié)程的運行流程
第一步琼腔,協(xié)程A開始執(zhí)行。
第二步踱葛,協(xié)程A執(zhí)行到一半丹莲,進入暫停,執(zhí)行權(quán)轉(zhuǎn)移到協(xié)程B尸诽。
第三步甥材,(一段時間后)協(xié)程B交還執(zhí)行權(quán)。
第四步性含,協(xié)程A恢復執(zhí)行擂达。
function asnycJob() {
// ...其他代碼
var f = yield readFile(fileA);
// ...其他代碼
}
上面代碼的函數(shù) asyncJob 是一個協(xié)程,它的奧妙就在其中的 yield 命令胶滋。它表示執(zhí)行到此處板鬓,執(zhí)行權(quán)將交給其他協(xié)程。也就是說究恤,yield命令是異步兩個階段的分界線俭令。
協(xié)程遇到 yield 命令就暫停,等到執(zhí)行權(quán)返回部宿,再從暫停的地方繼續(xù)往后執(zhí)行抄腔。它的最大優(yōu)點,就是代碼的寫法非常像同步操作理张,如果去除yield命令赫蛇,簡直一模一樣。