美文网首页
同步异步深入理解

同步异步深入理解

作者: 暖年的咆哮 | 来源:发表于2018-11-27 16:02 被阅读0次

JS是“单线程”的,所以处于这个线程上的所有任务,都会一个一个依次执行,所以在某些特殊情况下,例如ajax请求等,就会造成请求如果时间太长,导致后续任务一直在等待,页面不加载等问题出现,所以就出现了异步的概念。

同步和异步的差别就在于这条流水线上各个流程的执行顺序不同。

最基础的异步是 setTimeout() 和 setInterval() 函数,很常见,但是很少人有人知道其实这就是异步,因为它们可以控制JS的执行顺序。我们也可以简单地理解为:可以改变程序正常执行顺序的操作就可以看成是异步操作。如下代码:

                <script>
                    console.log( "1" );
                    setTimeout(function() {
                        console.log( "2" )
                    }, 0 );
                    setTimeout(function() {
                        console.log( "3" )
                    }, 0 );
                    setTimeout(function() {
                        console.log( "4" )
                    }, 0 );
                    console.log( "5" );
                </scripe>
                //1,5,2,3,4

可见,尽管我们设置了setTimeout(function,time)中的等待时间为0,结果其中的function还是最后执行。
所以在最初的JS设计者中有了一个任务队列的概念:

javascript是单线程。单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。于是就有一个概念——任务队列。如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。于是JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。

于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。

同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务指的是,不进入主线程、而进入"任务队列"(taskqueue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

具体来说,异步运行机制如下:
(1)所有同步任务都在主线程上执行,形成一个执行栈(execution context stack)。
(2)主线程之外,还存在一个"任务队列"(task queue)。只要异步任务有了运行结果,就在"任务队列"之中放置一个事件。
(3)一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
(4)主线程不断重复上面的第三步。

所谓"回调函数"(callback),就是那些会被主线程挂起来的代码,异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。例如ajax的success,complete,error也都指定了各自的回调函数,这些函数就会加入“任务队列”中,等待执行

相关文章

  • C++ 网络编程 pdf

    可以深入理解到同步异步等重要概念 链接待更新

  • 同步异步深入理解

    JS是“单线程”的,所以处于这个线程上的所有任务,都会一个一个依次执行,所以在某些特殊情况下,例如ajax请求等,...

  • Java AIO基础

    Java AIO(异步IO)特性是在Java7引入的。 [TOC] 同步异步、阻塞非阻塞的理解 同步和异步 同步和...

  • 简单理解异步,非阻塞和 IO 复用

    1.1 同步与异步 同步与异步的理解 同步与异步的重点在消息通知的方式上,也就是调用结果通知的方式。同步: 当一个...

  • JS 函数的执行时机

    1.同步和异步的区别 我们都知道JS里面有同步和异步的区别,怎么理解同步和异步呢。一家餐厅吧来了5个客人,同步的意...

  • 网络编程基本概念

    网络编程有一些基本概念需要理解掌握,比如同步、异步、阻塞非阻塞。 1. 同步vs异步 同步与异步主要是从消息通知机...

  • (2018-05-30.Python从Zero到One)8、(T

    7 异步与WebSockets 知识点 理解同步与异步执行过程 理解异步代码的回调写法与yield写法 Torna...

  • iOS - 多线程

    CGD: 理解下同步和异步: 1、同步 - 主线程执行 输出结果: 2、异步 - 主线程执行 输出结果: 3、串行...

  • 同步、异步、阻塞、非阻塞,这下明白了

    同步阻塞,同步非阻塞,异步阻塞,异步非阻塞... 晕! 头! 转! 向! 对于小白来说,理解这些概念太难了。搜索这...

  • 同步和异步的理解

    但是js又分为同步和异步,那这里的异步和同步我们应该如何理解呢其实同步和异步,无论如何,做事情的时候都是只有一条流...

网友评论

      本文标题:同步异步深入理解

      本文链接:https://www.haomeiwen.com/subject/eangqqtx.html