同步和异步

同步和异步

所谓同步,是指一个进程必需等待另一个进程的结果。

所谓异步,是指不需要等待其他进程,继续做自己的事件

静态资源的加载没有异步同步一说(script 例外),浏览器默认都是并行加载静态资源的

<script>标签是同步加载的

加载外部脚本时,浏览器会暂停页面渲染,等待脚本下载并执行完成后,再继续渲染。原因是JavaScript可以修改DOM(比如使用document.write方法),所以必须把控制权让给它。

如果外部脚本加载时间很长(比如一直无法完成下载),就会造成网页长时间失去响应,浏览器就会呈现“假死”状态,这被称为“阻塞效应”。

为了避免这种情况,较好的做法是将<script>标签都放在页面底部,而不是头部

defer属性

浏览器开始解析HTML网页
解析过程中,发现带有defer属性的script标签
浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本
浏览器完成解析HTML网页,此时再执行下载的脚本

async属性

async属性的作用是,使用另一个进程下载脚本,下载时不会阻塞渲染。(执行是同步的)

浏览器开始解析HTML网页
解析过程中,发现带有async属性的script标签
浏览器继续往下解析HTML网页,同时并行下载script标签中的外部脚本

**脚本下载完成,浏览器暂停解析HTML网页,开始执行下载的脚本**

脚本执行完毕,浏览器恢复解析HTML网页

async属性可以保证脚本下载的同时,浏览器继续渲染。需要注意的是,一旦采用这个属性,就无法保证脚本的执行顺序。哪个脚本先下载结束,就先执行那个脚本。如果同时使用async和defer属性,后者不起作用,浏览器行为由async属性决定。

nodejs的异步非阻塞和python的同步

Node.js一直都标榜自己是non-blocking I/O,不标榜自己是Asynchronous I/O。
所以异步I/O并不是说Node.js的特色,非阻塞才是。
nodejs是单线程异步

单线程指的是主线程是“单线程”的,所有阻塞的部分交给一个线程池处理,然后这个主线程通过一个队列跟线程池协作,于是对我们写到的js代码部分,不再关心线程问题,代码也主要由一堆callback回调构成,然后主线程在不停的循环过程中,适时调用这些代码。

python可以用多线程实现异步