同步和异步
创始人
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次,现实的代码可能比这更加复杂;

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

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...