操作系统中一个杰出的设计是线程,操作系统把CPU处理时间分片后划分出许多短暂的时间片,在时间T1执行一个线程的指令,到时间T2再执行下一个线程的指令,各个线程轮流执行,结果好像是所有线程都在并行前进。这样,编程时可以创建多个线程,在同一期间执行,各个线程可以并行的完成不同的任务。
在单线程中,计算机是一台严格意义上的冯诺依曼式机器,一段代码调用了另一段代码时,只能采用同步调用。简单俩说,必须等待这段代码执行完毕并返回结果后,调用方才能继续向下执行。
有了多线程的支持后,可以采用异步调用,也就是说,调用方和被调方可以属于不同的线程,调用方启动被调方线程后,不等待对象返回结果就继续执行后续代码。
计算中有些处理时比较耗时的,调用这种处理代码时,调用方如果苦苦等待会严重影响程序的性能。
异步调用虽然原理并不复杂,但在使用中容易出现莫名其妙的问题,特别是不同线程共享代码或贡献数据时容易出现问题。因此,要设计一个安全高效的的编程方式需要比较多的设计经验,因此最好不要滥用异步。
异步
JavaScript的异步处理上,ES5的回调函数callback
使我们陷入地狱,ES6的承诺promise
使我们脱离魔障,ES7的异步等待async-await
终于带领我们走向了光明。
其实async-await
是promise
和generator
的语法糖,是为了编码时更加流畅,同时增强代码的可读性。
async
用来表示函数是异步的,使用async
定义的函数会返回一个promise
对象,因此可使用then
方法添加回调函数。
await
可以理解为async wait
的缩写,await
必须出现在async
函数内部,因此它是不能够单独使用的。
await
后面可以跟任何JS表达式,作用是用来等待promise
对象的状态被resolved
。如果await
异步等待的是promise
对象则会造成异步函数停止执行并且等待promise
的解决,如果等待的是正常的表达式则会立即执行。
async function fn()
{
let results = await Math.random();
}
function sleep(seconds)
{
return new Promise((resolve, reject)=>{
setTimeout(()=>{
resolve("sleep over");
}, seconds);
});
}
function fn()
{
}