我不是很理解异步,说到异步,大家都会说Ajax 这个我明白,浏览器有专门的通讯进程可以做执行者,有别人说可以通过定时器来做到异步,这我就很不明白了,假设js主进程内是无执行内容的,定时器效果触发进入消息队列然后进入主进程序列执行,从本质上来说,执行方还是js主进程,既然是主程序执行,难道所谓的异步是指延迟执行?既然是异步,那执行者又是什么,换到node中,node的定时器还能用来做异步么,或者说还有其他异步的方法。求大神指点迷津!
我理解楼主是有两个问题:1、异步究竟指啥? 2、js中的异步主线程没干活谁在干活?
如果楼主还差很多概念不是很清楚,那需要多了解一下,这里一言两语很难让你透彻理解。 我试着按这俩问题回答一下:
异步
一般指调用后,不等真正要的事做完,就直接返回执行权。真正要做的事做完了,通过消息机制和开始返回的引用获得结果–并行重叠
。
对应的同步
的调用后,要一直等到真正的事做完才返回–顺序依赖
。
node中的异步
,多数由libuv
分类完成(交给了主线程之外)。其中多数networkIO
类任务交给os(socket epoll)
;FileIO
类会交给node启动时一同启动的工作线程池worker thread_pool
(主线程之外的线程,默认启动数量是四个)。这就出现了上面说的并行,任务完成后,会通过消息机制把结果和给回到主线程,然后如楼主所说进入队列等待执行回调。
另外,还有一对概念:并发concurrency 和 并行parallelism 的区别
。首先单核在某一时间点,是只能执行一个任务的。但可以通过快速切换任务,对外看起来是在同时执行多个任务。敲黑板–>按csapp里的解释:并发指多个任务间,开始和结束的时间有重叠
,但这种重叠背后有可能是单核不停的在多任务间切换,也有另一种可能是多核同一时间上的一起执行多个任务
。这后面另一种可能,就是所谓并行
。
希望对楼主有帮助:)
参考链接: http://docs.libuv.org/en/v1.x/design.html https://nodejs.org/en/docs/guides/ 知乎:怎样理解阻塞非阻塞与同步异步的区别 https://github.com/danbev/learning-nodejs
感觉稍微看懂了点,按我的观点回答一下,不喜勿喷。 我感觉你没弄清楚异步的意思,异步跟同步比,同步本质上是在不同线程中执行,所以从物理上可以看做它们是同时执行的(单核单线程cpu就是来回切换,多核多线程cpu可以实现真正的同步)。 而你的提问中的执行者我理解为执行它的cpu,你说定时任务由哪个执行者去执行,Node的程序就一个cpu会在执行(多核cpu下具体哪个cpu执行由系统调配,但程序同一时刻只会由一个cpu执行),所以定时任务和主程序一样都是由一个执行者执行,它的异步是一个概念,也就是我们人类从工程学上的概念。而对于程序,它就是一段程序,对于程序它就是一段段代码被执行。(如果你学过Java,java里面的回调就是这种异步概念)。 说了一些,感觉不是很清晰。你看看,有什么问题可以继续讨论。
先来一个概念:不管是浏览器还是服务器,都是死循环执行。 浏览器的死循环,毫秒级刷新界面,毫秒级的监听你键盘和鼠标动态。让你看到画面是流畅的动画,不是一副图片。 服务器死循环,无限循环监听端口的请求。
浏览器为什么有异步?就是因为主线程要无限死循环刷新动画,你一个任务要 3000 毫秒,如果我浏览器等你 3000 毫秒再继续刷新下一帧动画,不就有 3000 毫秒的时间卡顿吗? 异步的问题主要是解决一些耗时操作,io 操作,或则网络操作,让主线程可以继续死循环刷新界面而已。
我是这样理解的~,如有错误告知我,我删除即可
node.js中的进程实际相当于一个调度者,有且只有一个。他并不干活 ,就相当于只有一个跑堂服务员的餐馆。 来吃饭的顾客点菜,交给服务员,然后服务员把菜单交给后厨,后厨可能有很多个,实际的工作是由后厨完成的。 服务员负责拿菜单,交给后厨,后厨做菜要花时间,这就是延迟。 把点菜单交个后厨以后,可以再招呼其他的顾客。 这时如果后厨如果有做好的菜,就会通知服务员,但是服务员只有一个,只能等手头顾客点完菜,立马飞奔到出菜口,把菜端给顾客。如果出菜口做好了几十种菜,对不起。服务员也只有一只手, 它会把这些任务挨个处理。 如果没有顾客了,才也做完了, 服务员可以眯一下了。
你的程序就是顾客,node.js就是服务员, 数据库和文件操作就是后厨。 服务员接收菜单,交给后厨,把菜端给顾客之间的时间就是延迟。 javascript中的单线程是一回事。 只不过后厨并不是数据库操作和文件操作,是执行某个函数。道理完全一样