- 說異步和同步的時候,講一下并發(fā)和并行。計(jì)算中并行和并發(fā)是不同的概念,對應(yīng)parallel和concurrent。
- 并行:舉個栗子一個4核8線程的計(jì)算機(jī),這時候同時有8個程序運(yùn)行,每個程序占用一個線程,那么現(xiàn)在可以說這8個程序是并行的,同時走的。
- 并發(fā):如果程序超過8個,超過的程序會停住嗎。例如播放音樂和打字,難道我要打字完成了,才能播放音樂。或者音樂播放完成了,我才能打字。不cpu是以時間片輪詢的方式,來執(zhí)行的,就是等你打字的時候,偷偷去放音樂,放音樂的時候可以讓你偷偷的打字,你卻感覺不到卡頓,或者感覺不到音樂會不流暢,因?yàn)閏pu速度太快了,已經(jīng)超過了你的感知范圍。很強(qiáng)!所以把這種程序交替運(yùn)行叫做并發(fā)。
也是和這個文章的看法一致:https://www.cnblogs.com/liu-runda/p/12599297.html
- 在說說進(jìn)程、線程
- 進(jìn)程:是資源分配的最小單位。多進(jìn)程,舉個栗子,一臺電腦開了QQ、微信、迅雷等等軟件。
- 線程:是CPU調(diào)度的最小單位。多線程,QQ你打開了多個聊天窗口。
在CPU比較繁忙,資源不足的時候(開啟了很多進(jìn)程),操作系統(tǒng)只為一個含有多線程的進(jìn)程分配僅有的CPU資源,這些線程就會為自己盡量多搶時間片,這就是通過多線程實(shí)現(xiàn)并發(fā),線程之間會競爭CPU資源爭取執(zhí)行機(jī)會。
在CPU資源比較充足的時候,一個進(jìn)程內(nèi)的多線程,可以被分配到不同的CPU資源,這就是通過多線程實(shí)現(xiàn)并行。
至于多線程實(shí)現(xiàn)的是并發(fā)還是并行?上面所說,所寫多線程可能被分配到一個CPU內(nèi)核中執(zhí)行,也可能被分配到不同CPU執(zhí)行,分配過程是操作系統(tǒng)所為,不可人為控制。所有,如果有人問我我所寫的多線程是并發(fā)還是并行的?我會說,都有可能
這篇文章講了多進(jìn)程和多線程的選擇:https://blog.csdn.net/yu876876/article/details/82810178可以參考下。
- 你應(yīng)該知道,javascript語言是一門“單線程”的語言,不像java語言,類繼承Thread再來個thread.start就可以開辟一個線程,所以,javascript就像一條流水線,僅僅是一條流水線而已,要么加工,要么包裝,不能同時進(jìn)行多個任務(wù)和流程。一個web請求就是一個線程。
- 現(xiàn)在我們在說到同步和異步
同步:簡單說就是代碼順序執(zhí)行,遇到耗時操作代碼會停住等待(python是同步的)。
異步:多個函數(shù)同時執(zhí)行時候,a函數(shù)需要等待,后面的b函數(shù)可以跳過等待繼續(xù)執(zhí)行(js默認(rèn)是異步執(zhí)行的)。
前端需要使用異步的場景是哪些(需要等待的時候):
定時任務(wù):setTimeout,setInterval
綁定事件:addEventListener(click等等)
網(wǎng)絡(luò)請求:ajax和img動態(tài)加載
上面說到了js是單線程和默認(rèn)又是異步執(zhí)行,這不是自相矛盾嗎?
其實(shí),單線程和異步確實(shí)不能同時成為一個語言的特性。js選擇了成為單線程的語言,所以它本身不可能是異步的,但js的宿主環(huán)境(比如瀏覽器,Node)是多線程的,宿主環(huán)境通過某種方式使得js具備了異步的屬性。這篇文章講述了js的異步是通過宿主環(huán)境來實(shí)現(xiàn)的:https://www.cnblogs.com/woodyblog/p/6061671.html
javascript是如何實(shí)現(xiàn)異步的:http://www.itdecent.cn/p/1a35857c78e5
既然js是異步執(zhí)行的我們就需要控制,實(shí)現(xiàn)異步,哪一些先執(zhí)行哪一些后執(zhí)行。主流的解決方法主要有以下幾種:
- 回調(diào)函數(shù)
function doSomething(callback){
setTimeout(function(){
console.log('執(zhí)行結(jié)束');
let result = 4;
callback(result);
},100);
}
function callback(result){
console.log('接收到結(jié)果為:'+result);
}
doSomething(callback);
doSomething((result)=>{console.log('接收到結(jié)果為:'+result)});
- async(ES7)
function doSomething(){
return new Promise(resolve=>{
setTimeout(function(){
let result = 6;
resolve(result);
},100);
});
}
async function action(){
let result = await doSomething();
console.log(result);
}
action();
發(fā)布/訂閱者模式
觀察者模式和發(fā)布訂閱模式區(qū)別:https://www.cnblogs.com/leaf930814/p/9014200.html
computed&watch&觀察者模式:https://blog.csdn.net/vv_bug/article/details/102519987promise
function doSomething(){
return new Promise(function(resolve){
setTimeout(function(){
console.log('執(zhí)行結(jié)束');
let result = 6;
resolve(result);
},100);
});
}
doSomething().then(result=>{
console.log('接收到結(jié)果為:'+result);
});
- generate函數(shù),參考:https://www.cnblogs.com/lfxiao/p/9360476.html
function doSomething(){
setTimeout(function(){
let result = 6;
it.next(result);
},100);
}
function *gener(){
var result = yield doSomething();
console.log(result);
}
let it = gener();
it.next();