node.js中对同步,异步,阻塞与非阻塞的理解
我们都知道javascript是单线程的,node.js是一个基于Chrome V8 引擎的 javascript 运行时环境,注意 node.js 不是一门语言,别搞错了。
javascript为什么是单线程的,这么做有什么好处?
因为历史原因,js的出现主要是为了解决页面的交互和操作DOM,如果是多线程的,就会带来比较复杂的同步问题。
比如两个线程同时操作一个DOM,那最终页面显示上会以哪个线程操作为准,这就是个问题。而单线程就没有这种问题。
创建线程是需要消耗资源的,早期js是嵌在网页中被浏览器解释运行的,如果是多线程那必然会消耗比较多的资源,显然与js的定位不符。
还有多线程之间的上下文切换也会比较消耗时间,这也是js是单线程的原因,估计js单线程这个特征以后也不会改变。
单线程的好处:1、没有线程间同步问题。2、节省创建线程资源。3、节省上下文切换时间。
但是单线程也有问题,所有的操作都必须一个一个来,如果中间有一个操作非常耗时,那整个运行都会阻塞在那里。
为了解决这个问题,js引入了事件和回调函数机制,对于一个IO操作,比如一个ajax,当发出一个异步请求后,程序不会阻塞在那里等待结果的返回,而是继续执行下面的代码。
当请求成功获取到结果后,就会调用回调函数来处理后面的事情,这个就是异步的非阻塞。
当然,异步 与 非阻塞,同步 与 阻塞,这两者之间概念很容易搞混。
一、同步与异步关注的是消息的通知方式。
同步,当发起一个调用时,在没有获取结果之前,调用不会返回,直到获取结果。事一件一件做,做完一件再做下一件。
异步,当发起一个调用时,在没有获取结果之前,调用就返回了,调用者并不会立即得到结果,而是被调用者通知调用者。通过回调函数处理结果。
二、阻塞与非阻塞关注的是等待结果(返回值)时的状态
阻塞,在等待结果的过程中,不能干其他事,线程被挂起,直到结果返回。
非阻塞,在等待结果的过程中,还能干其他事,线程不会被阻塞。
同步阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆在电话那边一直想啊想,你在电话这边不干别的,就一直等啊等,电话始终未挂,直到她说吃火锅,电话才挂掉。
同步非阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆在电话那边一直想啊想,你在电话这边该干什么干什么,电话始终未挂,直到她说吃火锅,电话才挂掉。
异步阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆说我想想,过一会跟你打话。你在电话这边什么也没干,就一直等着这个电话。
异步非阻塞方式:
比如,你打电话问老婆今晚吃什么,老婆说我想想,过一会跟你打话。你在电话这边想干什么干什么,如果有电话来了,再处理电话。
同步与异步是被调用方决定的,决定是马上给你答案,还是过会通知你,给你答案。
阻塞与非阻塞是调用方决定的,在等待结果的过程中, 是否还可以干其他事。
node.js中对同步,异步,阻塞与非阻塞的理解的更多相关文章
- JS中的同步异步问题
<script> /* * JS 是单线程 * 同步 异步 * 常见的异步 * 1.定时器 * 2.事件绑定 * 3.ajax请求(一般的都是异步) * 4.回调函数也可以理解成 异步 * ...
- JS中的同步异步编程
首先我们先看看同步与异步的定义,及浏览器的执行机制,方便我们更好地理解同步异步编程. 浏览器是多线程的,JS是单线程的(浏览器只分配一个线程来执行JS) 进程大线程小:一个进程中包含多个线程,例如 ...
- Node.js 中的进程和线程
线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢? 一.进程和线程 1.1.专业性文字定义 进程(Process),进程是计算机中 ...
- JS异步解决方案之概念理解-----------阻塞和非阻塞,同步和异步,并发和并行,单线程和多线程
首先记住一句话,JS是单线程的. 单线程意味着什么?单线程意味着 它不能依靠自己实现异步. JS实现的异步,往往都是靠 浏览器.Node 的机制(事件驱动.回调)实现的. 下面让我这个单身狗 以谈恋爱 ...
- IO中同步异步,阻塞与非阻塞 -- 通俗篇
一.同步与异步 同步/异步, 它们是消息的通知机制 1. 概念解释 A. 同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例 ...
- 关于js中的同步和异步
最近看到前端面试问到js中的同步和异步,这个问题该怎么回答? 梳理一下,js对于异步的处理,很多人的第一反应是ajax,这只能说是对了一半. 1.个人觉得,js中,最基础的异步是setTimeout和 ...
- IO中同步、异步与阻塞、非阻塞的区别
一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...
- IO中同步、异步与阻塞、非阻塞的区别(转)
转自:http://blog.chinaunix.net/uid-26000296-id-3754118.html 一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步, ...
- socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?
一.举个打电话的例子: 阻塞 block 是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞 nonblock 是指,你拨通 ...
随机推荐
- gitbash上使用tree
gitbash上使用tree vscode从cmd设置gitbash之后,想在使用windows下的tree命令发现运行不了,有两种解决方案. 1,在gitbash上cmd //c tree,就等同c ...
- 浅析SQL Server 中的SOS_SCHEDULER_YIELD类型的等待
本文出处:http://www.cnblogs.com/wy123/p/6856802.html 进程的状态转换 在说明SOS_SCHEDULER_YIELD等待之前,先简要介绍一下进程的状态(迷迷糊 ...
- 简单全局HOOK拦截大部分键盘消息
前言:学习HOOK中,万一老师讲解HOOK入门教程:http://www.cnblogs.com/del/category/124150.html http://www.cnblogs.com/del ...
- semver 版本号命名法
https://semver.org/lang/zh-CN/ 版本格式:主版本号.次版本号.修订号,版本号递增规则如下: 主版本号:当你做了不兼容的 API 修改, 次版本号:当你做了向下兼容的功能性 ...
- 为了显示此页面,Firefox 必须发送将重复此前动作的数据(例如搜索或者下订单)
火狐浏览器重新加载页面出现下面提示,必须要点击“重新发送”才能完成刚才的请求: 这个是火狐的一个提示功能主要是防止同一页面的数据反复提交: 解决方法: 不要用location.reload();来刷新 ...
- Hibernate 再接触 核心开发接口
1.可以重载方法进行配置文件的指定 sessionFactory = new AnnotationConfiguration().configure("hibernate.xml" ...
- HP LaserJet MFP M227-M231 scan use manual
HP LaserJet MFP M227-M231 scan use manual By xiangrikui 2018-10-10 Start menu/Right click Settings/ ...
- iphone上实现H264 硬编码
供ios下h264硬编码sdk,可以生成h264流. 我们的H264 SDK提供了一个理想的软件开发工具包,使您的app可以在iPhone或iPod上实时的访问H264帧数据.SDK提供了一套API功 ...
- hdu1002-A + B Problem II-(java大数)
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- jquery 获取表单的用户输入值的方法
以前的表单中的select input textarea的用户选择输入是通过jQuery的val()方法获取到的,在三一Java前端大拿教我了一个方法可以不用那么麻烦获取数据,只要在这些表单元素上加n ...