Skip to content

[js] 第98天 说说你理解的同步和异步的区别是什么? #973

Open
@haizhilin2013

Description

@haizhilin2013

第98天 说说你理解的同步和异步的区别是什么?

Activity

dondonZh

dondonZh commented on Jul 23, 2019

@dondonZh

同步 ,,只能单步执行
异步。。 能一起执行

ghost

ghost commented on Jul 23, 2019

@ghost

同步和异步是用于描述一个操作的阻塞性的形容词。 这句话可能有表述错误。

  • 同步意味着在等待某个操作执行完毕时,不能进行其他操作;
  • 异步则意味着在此期间可以进行其他操作。
    • 异步的实现方法有 Callback、Promise 等。
hunterhug

hunterhug commented on Jul 23, 2019

@hunterhug

在现实世界中。

同步就是一气呵成,做事情,这件事情就要一条龙做到底,异步就是我做了一半,然后去做另外的事情,然后还要时不时回来盯着这件事到底做好了没有。

在程序世界,

HTTP请求或者其他程序方法调用,请求一次,整件事情就做完了,叫同步,如果处理时间很长,就卡住,直到处理完返回,造成的后果是,如果请求不是双工的,会有请求超时问题。

异步,就是HTTP请求后直接返回,不知道请求结果,另起一个HTTP请求定时去获取结果。

Nodejs的核心就是回调,默认全是异步,当然你可以强制同步堵塞住。

nulidangxueba

nulidangxueba commented on Jul 23, 2019

@nulidangxueba

同步就是上一个任务结束下一个任务再开始,比如alert弹窗,你不点击确定他就会阻塞后边代码的执行;
异步就是按顺序开始(不可能同时开始)但是不一定按顺序结束,比如图片的加载就是走的异步。

nowherebutup

nowherebutup commented on Jul 23, 2019

@nowherebutup
  • 同步: 程序执行过程中,上一个任务结束立即执行下一个任务,执行的顺序和代码的顺序一致;
  • 异步: 程序执行过程中,上一个任务执行结束立即执行回调函数,下一个任务不用等到上一个任务执行完成再执行,执行的顺序和代码书写的顺序有些差异;
LinStan

LinStan commented on Jul 23, 2019

@LinStan

同步:指的是同一时间只会执行一个任务,只有当前任务执行结束才会继续执行下一个任务。
异步:指的是人主观上同一时间程序同时进行多个任务,实际上是已极小的时间间隔在不同任务间进行切换来实现的。
JS中指的就是多个任务按照你编码的顺序开始任务,但是任务的完成顺序并不一定和开始的顺序相同。
常用的异步实现方法有回调、Promise

joyeeLee

joyeeLee commented on Jul 23, 2019

@joyeeLee

同步和异步就像物理里面的串联和并联一样
同步是执行某一任务成功与否影响下一步任务的执行
异步是每个任务之间互相不影响

Drowned-fish

Drowned-fish commented on Jul 24, 2019

@Drowned-fish

由于JS是单线程的,所以同步的意思是等待当前任务完成,然后再执行下面的代码。异步解决了阻塞问题。

EmiyaYang

EmiyaYang commented on Jul 24, 2019

@EmiyaYang

@t532

同步和异步是用于描述一个操作的阻塞性的形容词。

  • _同步_意味着在等待某个操作执行完毕时,不能进行其他操作;

  • _异步_则意味着在此期间可以进行其他操作。

    • 异步的实现方法有 Callback、Promise 等。

谈下我的看法,不正之处还请指出。

同步与异步,阻塞与非阻塞应该是两对概念。
同步与异步的区别在于程序是否需要等待调用结果出来才能继续执行
阻塞与非阻塞的区别在于程序调用线程是否会挂起等待调用结果

由于JavaScript是单线程语言,所以只存在同步阻塞与异步非阻塞。

ghost

ghost commented on Jul 24, 2019

@ghost

@EmiyaYang

谈下我的看法,不正之处还请指出。

同步与异步,阻塞与非阻塞应该是两对概念。
同步与异步的区别在于程序是否需要等待调用结果出来才能继续执行
阻塞与非阻塞的区别在于程序调用线程是否会挂起等待调用结果

由于JavaScript是单线程语言,所以只存在同步阻塞与异步非阻塞。

是否可以理解为,同步与异步更加偏向表述程序执行逻辑的不同,而阻塞和非阻塞是底层的线程限制?

如果这样,async function 内的 await ... 能否视为局部的“同步非阻塞”操作?而“同步非阻塞”、“异步阻塞”又是否在其他语言中存在呢?

EmiyaYang

EmiyaYang commented on Jul 24, 2019

@EmiyaYang

@t532

是否可以理解为,同步与异步更加偏向表述程序执行逻辑的不同,而阻塞和非阻塞是底层的线程限制?

如果这样,async function 内的 await ... 能否视为局部的“同步非阻塞”操作?而“同步非阻塞”、“异步阻塞”又是否在其他语言中存在呢?

首先,我认为你的理解是正确的。
其次,现阶段async/await还只是语法糖吧,本质还是promise,所以还是属于异步非阻塞。关于“同步非阻塞”、“异步阻塞”的在其他语言的具体应用场景,我回答不了。

ghost

ghost commented on Jul 24, 2019

@ghost

@EmiyaYang

首先,我认为你的理解是正确的。
其次,现阶段async/await还只是语法糖吧,本质还是promise,所以还是属于异步非阻塞。关于“同步非阻塞”、“异步阻塞”的在其他语言的具体应用场景,我回答不了。

谢谢你的解答,

其次,我仍然认为,虽然在全局上,一个 async function 的执行是异步非阻塞的(在支持 Top-level await 后,这个说法可能也不准确了),但是在它内部的上下文中, await ... 仍然是同步非阻塞的,因为它表述了当前上下文的等待操作。

我会这么想的原因主要是,我认为同步与异步是一个抽象的表述程序执行逻辑的术语,而不必牵扯到具体的技术实现,也因此可以细分成多个不同的层次来讨论(一组程序、一个程序、一个函数、一个内置运算符、...);相反的,阻塞和非阻塞牵涉到底层的线程管理,因此我们只能按线程来讨论。不知这个观点是否正确,如有错误请您指正。

另外,async/await 并非只有现阶段是语法糖,它就是语法糖。

zlx362211854

zlx362211854 commented on Jul 31, 2019

@zlx362211854

同步代码执行在js主线程中,异步保存在异步队列中,具体实现是js宿主去执行,js只负责监听回调,所以异步能实现非阻塞,本质是借助了js宿主(浏览器或者node)去执行的。具体之前有个issue描述过:
javascript是单线程语言,那他的异步机制是怎么实现的

lizhesystem

lizhesystem commented on Jul 15, 2020

@lizhesystem

同步会阻塞,会等待,相当于单线程执行任务,任务执行顺序一个一个执行,当前任务不执行完不会执行下个任务。

异步不会阻塞,一起执行,互不影响,并且会监测点哪个任务执行完了,看是否继续进行新的任务。

xiaoqiangz

xiaoqiangz commented on Jun 24, 2022

@xiaoqiangz

由于Js是单线程,同步可以理解为当前任务没执行完就会一直阻塞后续任务的执行,只有等当前任务执行完才可以执行后续任务;异步则不会阻塞后续任务的执行,会一并按顺序执行,互不干扰,如有回调函数执行完后会触发对应的回调函数。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    jsJavaScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @haizhilin2013@nulidangxueba@hunterhug@xiaoqiangz@EmiyaYang

        Issue actions

          [js] 第98天 说说你理解的同步和异步的区别是什么? · Issue #973 · haizlin/fe-interview