ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] >[success] # 进程和线程 1. 进程(process):计算机已经运行的程序,是操作系统管理程序的一种方式; 2. 线程(thread):操作系统能够运行运算调度的最小单位,通常情况下它被包含在进程中,每一个进程中,都会启动至少一个线程用来执行程序中的代码,这个线程被称之为主线程,也可以说进程是线程的容器 3. CPU的运算速度非常快,它可以快速的在多个进程之间迅速的切换 因此我们可以使用电脑一边上网一遍听歌 >[success] # 异步、同步、阻塞、非阻塞概念 ~~~ 1.在弄清这些问题前明白一个问题,像java,python 这类语言他是们支持多进程和多线程,这样的好处就是 如果一下线程或者进程阻塞,可以通过启用其他线程或者进程来执行程序防止程序卡死,但是同样的问题 就是这些多线程会产生'线程竞争的情况',需要通过对其加锁进行防止这类问题的产生,当然java 和 python 是支持异步 2.js是单线程,单线程的解释'单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须' '处理好,后面的才会执行。'这样就会出现一个问题,当页面请求或者在做一件特别耗费时间的任务,整个 程序都会卡死等待这类任务结束才能接下来运行,js又不像java 和 python 这类语言可以开启其他线程或者进程 来解决这类任务,因此我们可以提出一个设想,这类耗时的任务我们先将其跳过不影响接下来的代码执行, 在未来的某一个时刻去拿他们最后执行结果 ~~~ >[danger] ##### js这种单线程语言的优缺点 * 优点 ~~~ 1.实现起来比较简单,执行环境相对单纯,我们只要顺着正常逻辑思维去写代码执行顺序 ~~~ * 缺点 ~~~ 1.如果一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行,例如: 浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环), 导致整个页面卡在这个地方,其他任务无法执行。 ~~~ >[info] ## 同步、异步、阻塞、非阻塞 [内容参考链接1](https://www.zhihu.com/question/19732473) [内容参考链接2](https://my.oschina.net/huangguangsheng/blog/2231195) ~~~ 1.在了解'同步、异步、阻塞、非阻塞'这四个概念之前,要先知道调用函数的过程分成两部分'执行操作和返回结果' 2.'同步和异步关注的是消息通信机制' 2.1.同步,就是在发出一个'调用'时,在没有得到结果之前,该'调用'就不返回。但是一旦调用返回 就得到返回值了,也就是说'调用者主动等待这个调用的结果' 2.2.异步,'调用'在发出之后,这个调用就直接返回了,所以没有返回'结果',调用者不会立刻得到结果。 而是在'调用'发出后,'被调用者'通过状态、通知来通知调用者,或通过回调函数处理这个调用 ,异步编程分 多种例如'多线程异步编程'/'单线程异步编程(JS是EventQueue+EventLoop机制完成单线程异步编程的)' 2.3.总结: 同步:'即使调用函数执行的任务比较耗时,也会一直等待直到得到预期结果' 异步:'发出调用之后,马上返回,但是不会马上返回预期结果。调用者不必主动等待', '当被调用者得到结果之后会通过回调函数主动通知调用者' 3.'阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态' 3.1.阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。 3.2.非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程 3.3.总结:'也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说' ~~~ >[danger] ##### 参考四种状态比喻案例 [内容参考链接](https://blog.csdn.net/Pythoncxy/article/details/96998336) >[danger] ##### 同步和异步的例子 ~~~ 1.syncAdd 立刻得到结果,asyncAdd稍后才得到结果 ~~~ ~~~ function syncAdd(a, b) { return a + b; } syncAdd(1, 2) // 立即得到结果 3 function asyncAdd(a, b, cb) { setTimeout(function () { cb(a + b); }, 1000) } asyncAdd(1, 2, console.log) // 1s后打印结果 3 ~~~ >[danger] ##### 总结 ~~~ 1.代码按顺序一步一步执行,就是同步是错的,异步也是按照顺序执行的,只不过是执行到他的时候 不关心结果了,被弹出去等到未来在获取结果,所谓的同步异步是针对结果,不是针对执行顺序 ~~~ >[danger] ##### 推荐阅读 [最官方MDN -- 异步](https://developer.mozilla.org/zh-CN/docs/learn/JavaScript/%E5%BC%82%E6%AD%A5)