迷迷糊糊-js单线程

此文参考了阮一峰老师。

1.js的语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么js不能有多个线程呢?这样能提高效率啊。

js的单线程,与它的用途有关。作为浏览器脚本语言,js的主要用途是与用户互动,以及操作dom。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定js有同时有两个线程,一个线程在某个dom的节点上添加内容,另一个线程删除这个节点,这时的浏览器应该以哪个线程为准呢?

所以,为了避免复杂性,从一诞生,js就是单线程,这已经成了这门语言的核心特征,将来也不会变。

为了利用多核cpu的计算能力,html5提出web worker标准,允许js脚本创建多个线程,但是子线程完全受主线程控制,且不得操作dom,所以这个新标准并没有改变js单线程的本质。

2.任务队列

单线程就是意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。

如果排队是因为计算量大,cpu忙不过来,倒也算了,但是很多时候cpu是闲着的,因为io(输入输出设备)很慢(比如ajax操作从网络读取数据),不得不等结果出来,再往下执行。

js语言设计者意识到,这时主线程完全可以不管io设备,挂起处于等待中的任务,先运行排在后面的任务。等到io设备返回了结果,再回过头,吧挂起的任务继续执行下去。

于是,所有的任务可以分为两种,一种是同步任务,另一种是异步任务。同步任务指的是,在主线程上排队执行任务,只要前一个任务执行完毕,才能执行后一个任务;异步任务指的是:不进入主线程,而进入“任务队列”(task queue)的任务,只有“任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

你可能感兴趣的:(迷迷糊糊-js单线程)