同步和异步
创始人
2024-06-03 02:32:52
0

一、进程和线程

代码编写完毕在编译的过程中计算机的内存中会开辟一个空间来存储代码,这个空间就相当于是进程,可以将进程类比于工厂的厂房,但代码相当于原材料,但仅有厂房和原材料无法生产,还需要工人进行加工,工人则类比于线程

  • 线程(厂房):程序运行的环境
  • 线程(工人):线程

二、同步和异步

程序的运行分为同步和异步两种;

同步

同步指的是事情按照顺序执行;例如早上起床,我们先刷牙,再洗脸,最后吃早餐,讲究的是事情先后的执行顺序

通常情况下我们的程序时按照同步执行的,即按照顺序一条一条执行,一条执行完毕执行下一条,如下所示:

/*同步- 通常情况下代码都是自上而下的
*/
console.log("哈哈")
console.log("嘻嘻")
console.log("嘿嘿")

通过快捷键F5通过NodeJs在控制台中打印输出内容为以上顺序执行的结果

哈哈嘻嘻嘿嘿

下面的代码示例就是非常典型的同步结构的代码:

function sum(a, b){return a + b
}console.log("第一行打印")
let result = sum(123, 234)
console.log(result)
console.log("第二行打印")

 

 同步的特点是逻辑清晰、结构简单、容易理解;

同步:

  • 通常情况下代码都是自上而下一行一行执行的
  • 前边的代码不执行后边的代码也不会执行
  • 同步的代码执行会出现阻塞的情况
  • 一行代码执行慢会影响到整个代码的执行

解决同步的问题:

  •   java python

        -  通过多线程来解决

  • node.js

        -  通过异步的方式来解决

           

阻塞

同步最大的问题就是阻塞;

所谓的阻塞就是按顺序执行的代码,前面不执行完毕后面的代码不会执行;

function sum(a, b){let begin = Date.now()while(Date.now() - begin < 10000){}return a + b
}console.log("第一行打印")
let result = sum(123, 234)
console.log(result)
console.log("第二行打印")

上述sum()执行的时候会停顿10秒,10秒后才会返回结果,由于是同步执行代码,所以sum()会阻碍后面所有代码的执行,导致整个程序的执行速度变慢 

异步

- 一段代码的执行不会影响到其他程序

- 异步的问题:

        - 异步的代码无法通过return来设置返回值

- 特点:

        1. 不会阻塞其他代码的执行

        2. 需要通过回调函数来返回结果

- 基于回调函数的异步带来的问题

        1. 代码的可读性差

        2. 可调试性差

- 解决问题:

        - 需要一个东西,可以代替回调函数来给我们返回结果

                - Promise是一个可以用来存储数据的对象

                        Promise存储数据的方式比较特殊;

                                这种特殊的方式使得Promise可以用来存储异步调用的数据

在程序中,有些代码的执行速度很快,比如说:打印一个内容、接受一个请求、发送一个响应这些都是简单且能快速反应的操作,但例如:读写硬盘中的文件(I/O)操作这些就会非常的慢,如果在这些非常耗时的操作影响到能快速反应的操作,这是我们不希望看到的

对于其他语言,例如java,处理这类问题的方式简单粗暴,就是直接开启多线程,每一个线程处理一个事务,避免相互干扰;

但是对于Node.js来说,它本身就是单线程的,那么如何处理这种情况,答案就是采用异步;当我们去读取一个比较大的文件时,node先将指令发给计算机,然后再由计算机去读取文件,此时node的线程不是等待计算机数据返回,而是继续向下执行其他的操作,那么何时去获取计算机读取到的数据呢?等数据返回了我们再去读取,这样既不影响其他操作也可以正常的读取到计算机上返回的数据;

function sum(a, b){setTimeout(()=>{return a + b}, 10000)
}console.log("第一行打印")
let result = sum(123, 234)
console.log(result)
console.log("第二行打印")

上述代码中,我们将计算操作放到了setTimeout中,同样是等待10s,但是setTimeout不会阻塞其他代码的执行,而是在10s之后将函数放到了任务队列,这样一来就可以很好的解决阻塞问题。

但由于函数的返回值return到了setTimeout的回调函数中,此时我们再调用sum() 就无法获取到函数的计算结果了,因此后面调用sum()传入实参的时候计算结果为undefined;

那么如何获取异步代码的执行结果呢,只有通过回调函数了,异步代码通常都需要一个回调函数作为参数,当异步代码执行完毕取得结果时候便可以将结果作为回调函数的参数进行传递,这样我们便可以在回调函数中来读取结果,并完成后续操作

// 回调函数:将函数作为参数传递
function sum(a, b, cb){setTimeout(()=>{cb(a + b)}, 10000)
}console.log("第一行打印")
sum(123, 234, result => {console.log(result)
})console.log("第二行打印")

问题

异步通过回调函数解决运算结果的传递问题,但最大的问题也来自于回调函数,由于是异步执行,回调函数无法直接通过返回值来返回执行结果,想要取得结果必须通过回调函数,

这样就带来一个问题:如果我们有两个异步操作需要先后执行,一个异步操作依赖于上一个异步操作的结果,那么我们只能采取嵌套措施了

// 回调函数:将函数作为参数传递
function sum(a, b, cb){setTimeout(()=>{cb(a + b)}, 10000)
}console.log("11111")sum(123, 234, result => {// 计算777与前两个数的加和sum(result, 7, result => {// 拿结果再进行求和操作sum(result, 8, result => {sum(result, 9, result => {})})})
})

上述的示例中,调用了4次sum,每一次都调用了之前的计算结果,后一个是依赖前运算结果的;

这样子就是“回调地狱",又名死亡金字塔,这还只是4次,现实的代码可能比这更加复杂;

总之,异步提高了代码运行的效率,同样也增加了代码的复杂程度;

相关内容

热门资讯

我的心愿四年级100字作文怎... 篇一:我的心愿四年级100字作文怎么写42篇第一篇内容:我希望成为一名优秀的画家我是一个喜欢画画的孩...
感动的事四年级作文300字【... 感动的事四年级作文300字 篇一我的小伙伴我有一个特别好的小伙伴,他叫小明。他是一个非常善良和乐于助...
回乡偶书【优选4篇】 回乡偶书 篇一 回乡偶书 篇二回乡偶书 篇三 重庆市忠县实验小学四年级二班:申晓航         ...
想象四年级作文400字(精简... 想象四年级作文400字 篇一我的未来世界我是一位四年级的学生,我有一个梦想,那就是拥有一个充满科技和...
四年级作文【精彩6篇】 四年级作文 篇一我喜欢的动物我喜欢的动物是小狗。小狗是一种可爱的动物,它们有着憨态可掬的外表和忠诚的...
四年级描写北京故宫的作文40... 四年级描写北京故宫的作文400字 篇一北京故宫是我国古代宫殿建筑的代表之一,它位于北京市中心,是中国...
四年级作文我的暑生活(通用6... 四年级作文我的暑生活 篇一我的暑假生活充满了欢乐和收获。这个暑假,我参加了许多有趣的活动,学到了很多...
玫瑰花和小雨珠四年级作文【通... 玫瑰花和小雨珠四年级作文 篇一玫瑰花和小雨珠我有一个好朋友,她叫小雨珠。她是我们班的班花,而我则是班...
我我快乐300字四年级作文8... 我快乐300字四年级作文 篇一我快乐的一天今天是我快乐的一天。早上我起床后,妈妈给我做了我最喜欢吃的...
我们这美丽的校园四年级作文(... 我们这美丽的校园四年级作文 篇一我热爱我的校园,因为它是如此美丽。每天早上,当我走进校园时,我都被各...
古老而神秘的海神庙四年级作文... 古老而神秘的海神庙四年级作文 篇一海神庙是一座古老而神秘的庙宇,位于一个小岛上。我和我的家人去参观了...
小书迷四年级作文【推荐6篇】 小书迷四年级作文 篇一看见书,我就忍不住心里狂喜。那是一种浓郁的书香,让我仿佛置身于一个神奇的世界。...
五一劳动节四年级作文(精选6... 五一劳动节四年级作文 篇一五一劳动节是每年的五月一日,也是我们最期待的假期之一。这个节日是为了表彰劳...
四年级写我的动物朋友的作文第... 四年级写我的动物朋友的作文第四单元 篇一我的宠物狗我家养了一只非常可爱的宠物狗,它的名字叫小黑。小黑...
热爱生命四年级作文【优秀6篇... 热爱生命四年级作文 篇一热爱生命生命是最宝贵的财富,我们每个人都应该热爱生命。生命只有一次,我们要珍...
以我发现了为题的作文【优选3... 以我发现了为题的作文 篇一我发现了一片神奇的花海今天,我偶然发现了一片令人惊叹的花海,仿佛置身于童话...
小学生四年级以安全为主题作文... 小学生四年级以安全为主题作文 篇一标题:保护自己的安全安全是我们生活中非常重要的一部分,我们每个人都...
小青蛙四年级作文(精彩6篇) 小青蛙四年级作文 篇一:我的好朋友小青蛙我有一个好朋友,他是一只小青蛙。他的名字叫小绿,因为他全身都...
爱的教育作文【精彩6篇】 爱的教育作文 篇一爱,是一种最基本的人类情感,也是一种最重要的教育方式。在教育过程中,爱是最有效的催...
清明扫墓的作文(最新6篇) 清明扫墓的作文 篇一清明扫墓是我国传统的节日之一,也是我最喜欢的节日之一。每年的清明节,我都会和家人...