异步与同步,阻塞与非阻塞

日期:2017年3月13日      标签:前端, 异步, 阻塞

异步同步

异步在前端编程中是很常见的概念,那到底异步和同步是指什么?

  • 异步

异步指的是调用在发出后就立即返回了,也就是调用立即结束了,调用的结果通过信号等机制通知调用者,调用者可以在调用返回结果之前执行其他的操作,常用的处理方式是回调,这种场景大量存在于前端的ajax请求,nodejs的文件调用,网络调用场景当中;

$.post('/url', {
    title: '异步',
    content: 'xx'
}, function() {
    console.log('收到响应');
});
console.log('发送Ajax结束');  

如上所示的代码,可以看到收到响应是在发送AjaxA结束之后输出的。

  • 同步

同步指的是调用发出后程序将停止运行等待调用结果的返回,在调用结果返回之前是不能执行其他的操作的。这种场景大量存在于后端编程语言中,如PHP。

例子:

你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。 而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

例子来源于知乎

阻塞非阻塞

操作系统内核对于I/O只有两种方式:

  • 阻塞

调用之后需要等到系统内核层面完成所有操作后,调用才结束;

  • 非阻塞

调用之后立即返回,调用结果通过回调等方式返回。

例子:

你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边> 去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。 在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

例子来源于知乎

Another explain: JavaScript:彻底理解同步、异步和事件循环(Event Loop)

(正文完)



© 喻小右 2016 京ICP备15064386号-1