zoukankan      html  css  js  c++  java
  • JS异步解决方案之概念理解-----------阻塞和非阻塞,同步和异步,并发和并行,单线程和多线程

    首先记住一句话,JS是单线程的。

    单线程意味着什么?单线程意味着 它不能依靠自己实现异步

    JS实现的异步,往往都是靠 浏览器、Node 的机制(事件驱动、回调)实现的。

    下面让我这个单身狗 以谈恋爱举例子 来形容上述概念。


    问题1.什么是同步和异步?

    同步就是顺序执行。
    异步就是 最大限度地 利用资源,分配资源 所实现的 能并行多件事情的 假象。

    拿谈恋爱理解。 -- 同步、异步 指的是恋爱机制消息通信机制。

    • 同步就是 攻略上说的 先跟一个 女生交往,分手后,再和 下一个女生交往(针对一种现象)。
    • 异步就是 攻略上说的 拿 当前女友 不在的时间,跟另一个 女孩子 恋爱(针对一种现象)。

    问题2.什么是阻塞和非阻塞?

    阻塞,就是 一个时间只能做一个事情,上一件事情没做完,不能做下一件事情。
    非阻塞,就是上一件事情没做完,也可以做另外一件事情。

    拿谈恋爱理解。 -- 阻塞、非阻塞 指的是本人的恋爱状态等待调用结果的状态。

    • 阻塞就是 一个人,它和一个女生交往的时候,如果上一个女生没有分手,就不能和另一个女生交往。(针对的是本人)
    • 非阻塞就是 一个人,它和上一个女生开始交往,在还没有分手的情况下,能够立马和下一个女生交往。(针对的是本人)

    问题3.什么是并行和并发?

    并行,就是一个时间点,能做 多个事情。 (分身术)
    并发,就是一个时间段,能做多个事情。(通常说,服务器 1分钟能够处理 1000个请求就是 并发量1000)

    拿谈恋爱理解。 -- 并行、并发 的区别在于 时间点 和 时间段。 可以是 效率的一种体现。

    • 并行就是 每一分每一秒 都能同时和两个女生 谈恋爱。 (对于一个人来说,这是不可能的。但是两个人,可以同时和一个女生谈恋爱。所谓电脑的多核)
    • 并发就是 一个人 一年可以 谈两个 女朋友。

    问题4.什么是单线程和多线程?

    单线程,这是一种处理事情的结构。它代表着 一次只能处理一件事情。
    多线程,这也是一种处理事情的结构。它代表着 一次能处理多个事情。

    拿谈恋爱理解。 -- 单线程 和 多线程 其实就是 编程语言 特性 的 根本原因。

    • 单线程。 我只是一个人,我有一个身体,一个大脑。
    • 多线程。 我是一群人,我们有很多身体,群策群力。

    那么,回到 JS 这个语言来。

    • 1.JS是单线程的。(这里的单线程的意思是指 代码运行 的单线程)

    • 2.它可以异步、也可以同步,因为这是一个现象,JS可以通过 某些手段,来达到这些 效果。

    • 3.他通过 浏览器的 多线程 的特性,来实现 异步操作。(代码运行 单线程)
      他通过 Node.js自身的多线程 来实现 异步操作。(代码运行 单线程)

    • 4.JS的请求,一般不存在 并行,但它能够实现 高并发,通过异步的方式 实现高并发。原则上来讲,不存在 并行。

    虽然 node 的 I/O 操作开启了多个线程,但所有的线程 都是基于一个主线程,并行的要求是,同一个时间点,这个要求还是比较苛刻的。
    宏观上来讲,可以说是 并行。(伪并行)

    JS的缺点,不擅长密集型的工作。例如

    for (let i = 0; i < 1000000; i++) {
        console.log(i);
    }
    

    上面的代码 可能会 执行很久,数字加大后更久了。 会引起 阻塞。


    一些需要知道的。

    单线程 未必比 多线程 差。
    • 多线程需要频繁地 切换、创建 线程,这些都是 系统开销。
    • 单线程保证了 绝对的线程安全。 不会存在 对同一变量 同时读写的情况。

    总结

    单线程 和 多线程,是根本原因,是硬件限制。
    并发 和 并行,是根本原因 带来的 微观结果。

    同步 和 异步,关注的是消息通信机制。

    像异步交女朋友这种操作,看看这些攻略就好,它们只是万千攻略(机制)中的一种,未必能够实现

    阻塞 和 非阻塞,关注的是程序执行的方式。

    往往同步交两个女朋友是不可能的,因为现实往往不允许,所以阻塞才是正常的。
    JS之所以能够异步,还是通过浏览器开了后门(线程)。

  • 相关阅读:
    jmeter录制APP脚本
    jmeter的JDBC Request接口测试
    jmeter的webservice接口测试(SOAP/XML-RPC Request)
    jmeter接口测试小结
    jmeter普通的接口测试
    jmeter插件之PerfMon
    jmeter解决中文乱码问题
    session和cookies
    jmeter快速入门
    Python 基础
  • 原文地址:https://www.cnblogs.com/can-i-do/p/7134097.html
Copyright © 2011-2022 走看看