- 浏览: 243566 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
saiyaren:
你对hiphop的深入程度到了什么程度了?想和你进行探讨一下
facebook hiphop php vm 实现概述 -
eric_weitm:
lj3362569 写道可以再讲具体点么?还有现有的hipho ...
facebook hiphop php vm 实现概述 -
lj3362569:
可以再讲具体点么?还有现有的hiphop不支持哪些功能?
facebook hiphop php vm 实现概述
node.js 的异步模型
一、基本概念
阻塞式IO:cpu一直等到数据准备好了之后才会工作,即从函数调用开始,一直到数据准备好这段时间cpu是干等着的
非阻塞式的IO:数据准备好了之后发一个信号,此后cpu才会处理,即cpu不会干等着
阻塞式:相当于是轮训、非阻塞式相当于是中断
同步执行:语句的先后顺序就是cpu执行指令的顺序
异步执行:写在前面的语句不一定先执行,具体执行的时间不确定(一般是事件触发的)
可以看出,非阻塞io肯定要与异步执行结合才能保证程序逻辑的正确性,node.js中使用的是非阻塞的io
二、初衷
node.js的初衷是解决IO密集型的应用(与此相对的是cpu密集型)。在实际应用中,为了实现应用层的并发性,大多数程序都会使用多线程或者是多进程(尤其是server这种需要同时并发对外提供服务的程序)。程序逻辑一般都会处理数据,当出现数据冲突时多线程必须串行执行(即加锁),这样的话多开的线程实际上是没有达到并发的效果的,同时因为多线程时CPU要频繁的调度,反而会增加系统负担(对于实时性的server 如网游服务器,IM服务器等一般都不会开很多的线程,这些server最大的瓶颈都是网络或数据库等IO操作)。经过分析可知,系统的瓶颈主要是在IO上,即cpu执行的快没有用,整个程序的性能是综合的结果,从吞吐率上来说,多线程并没有比单线程快多少。
三、node.js的哲学
既然瓶颈是在IO,那我就对付这个IO。所以node.js采用单线程执行模型:所有需要cpu等待的东西,全部移出执行队列,等到IO执行好了之后,再放入一个回调进来。这样做的话,cpu就会一直做‘有意义’的事情。
这样做的好处:1、不用多线程,所以不用加锁、不用调度, cpu的吞吐率高很多。2、不用处理线程同步带来的n多的诡异问题。
坏处:要求程序员要有异步的思维模式,即下一行代码不一定是在什么时候执行。如果逻辑间有前后依赖关系,一定要将后面的逻辑放入回调中。
三、单线程模型下如何实现用户级的并发 -----------基于事件的timer
执行模型是单线程的,但是应用的逻辑可能要求是并发的,那么该如果实现用户级的并发呢?如果用c语言来实现,一般采用 经典的消息队列+ worker thread + 回调函数,
在node.js中,一般是使用timer,如果是无限循环的逻辑 一般包装一个scheduler就OK了。
四、node.js实现的异步事件的相关源代码(c实现)
node.js利用uvlib来实现跨平台,windows下事件循环的实现 在uvlib的 src/win/core.c --------UV_LOOP_ONCE
此宏的主要代码如下:
uv_update_time((loop)); \
uv_process_timers((loop)); \
\
/* Call idle callbacks if nothing to do. */ \
if ((loop)->pending_reqs_tail == NULL && \
(loop)->endgame_handles == NULL) { \
uv_idle_invoke((loop)); \
} \
\
uv_process_reqs((loop)); \ 先处理
uv_process_endgames((loop)); \
\
if ((loop)->refs <= 0) { \
break; \
} \
\
uv_prepare_invoke((loop)); \
\
poll((loop), (loop)->idle_handles == NULL && \ 后收集事件
(loop)->pending_reqs_tail == NULL && \
(loop)->endgame_handles == NULL && \
(loop)->refs > 0); \
\
uv_check_invoke((loop));
概括一下:执行引擎是一个无限循环的过程,每一次的循环都可以看做一个tick()。 一个tick内基本逻辑是
1、更新全局定时器,
2、检查timer是否到期(到的话就放入执行队列,在下一个tick中来执行),
3、执行此tick内的所有回调 -------schedule的过程
4、检查是否要退出
5、从OS处取出网络socket,文件操作等IO完成事件,
PS:因为每个tick要处理的事件数量是随机的,所以2个tick间的deltaTime不是固定不变的,所以node.js不保证帧率而是保证吞吐率,所以每一次tick的顺序是schedule(), poll()
一、基本概念
阻塞式IO:cpu一直等到数据准备好了之后才会工作,即从函数调用开始,一直到数据准备好这段时间cpu是干等着的
非阻塞式的IO:数据准备好了之后发一个信号,此后cpu才会处理,即cpu不会干等着
阻塞式:相当于是轮训、非阻塞式相当于是中断
同步执行:语句的先后顺序就是cpu执行指令的顺序
异步执行:写在前面的语句不一定先执行,具体执行的时间不确定(一般是事件触发的)
可以看出,非阻塞io肯定要与异步执行结合才能保证程序逻辑的正确性,node.js中使用的是非阻塞的io
二、初衷
node.js的初衷是解决IO密集型的应用(与此相对的是cpu密集型)。在实际应用中,为了实现应用层的并发性,大多数程序都会使用多线程或者是多进程(尤其是server这种需要同时并发对外提供服务的程序)。程序逻辑一般都会处理数据,当出现数据冲突时多线程必须串行执行(即加锁),这样的话多开的线程实际上是没有达到并发的效果的,同时因为多线程时CPU要频繁的调度,反而会增加系统负担(对于实时性的server 如网游服务器,IM服务器等一般都不会开很多的线程,这些server最大的瓶颈都是网络或数据库等IO操作)。经过分析可知,系统的瓶颈主要是在IO上,即cpu执行的快没有用,整个程序的性能是综合的结果,从吞吐率上来说,多线程并没有比单线程快多少。
三、node.js的哲学
既然瓶颈是在IO,那我就对付这个IO。所以node.js采用单线程执行模型:所有需要cpu等待的东西,全部移出执行队列,等到IO执行好了之后,再放入一个回调进来。这样做的话,cpu就会一直做‘有意义’的事情。
这样做的好处:1、不用多线程,所以不用加锁、不用调度, cpu的吞吐率高很多。2、不用处理线程同步带来的n多的诡异问题。
坏处:要求程序员要有异步的思维模式,即下一行代码不一定是在什么时候执行。如果逻辑间有前后依赖关系,一定要将后面的逻辑放入回调中。
三、单线程模型下如何实现用户级的并发 -----------基于事件的timer
执行模型是单线程的,但是应用的逻辑可能要求是并发的,那么该如果实现用户级的并发呢?如果用c语言来实现,一般采用 经典的消息队列+ worker thread + 回调函数,
在node.js中,一般是使用timer,如果是无限循环的逻辑 一般包装一个scheduler就OK了。
四、node.js实现的异步事件的相关源代码(c实现)
node.js利用uvlib来实现跨平台,windows下事件循环的实现 在uvlib的 src/win/core.c --------UV_LOOP_ONCE
此宏的主要代码如下:
uv_update_time((loop)); \
uv_process_timers((loop)); \
\
/* Call idle callbacks if nothing to do. */ \
if ((loop)->pending_reqs_tail == NULL && \
(loop)->endgame_handles == NULL) { \
uv_idle_invoke((loop)); \
} \
\
uv_process_reqs((loop)); \ 先处理
uv_process_endgames((loop)); \
\
if ((loop)->refs <= 0) { \
break; \
} \
\
uv_prepare_invoke((loop)); \
\
poll((loop), (loop)->idle_handles == NULL && \ 后收集事件
(loop)->pending_reqs_tail == NULL && \
(loop)->endgame_handles == NULL && \
(loop)->refs > 0); \
\
uv_check_invoke((loop));
概括一下:执行引擎是一个无限循环的过程,每一次的循环都可以看做一个tick()。 一个tick内基本逻辑是
1、更新全局定时器,
2、检查timer是否到期(到的话就放入执行队列,在下一个tick中来执行),
3、执行此tick内的所有回调 -------schedule的过程
4、检查是否要退出
5、从OS处取出网络socket,文件操作等IO完成事件,
PS:因为每个tick要处理的事件数量是随机的,所以2个tick间的deltaTime不是固定不变的,所以node.js不保证帧率而是保证吞吐率,所以每一次tick的顺序是schedule(), poll()
发表评论
-
antd的默认配置
2021-01-11 15:32 350antd pro的默认配置 1、connect的时候需要把 ... -
camunda 源代码解析(一)
2020-03-06 17:53 3041壹 基本概念 一、任 ... -
spring cloud gateway 分析一 主流程和层次
2020-02-14 19:27 565一、debug的调用栈如下: DispatcherHand ... -
B端产品学习笔记
2018-12-01 22:25 807B端产品学习笔记 一、B端产品分类:协作办公 即时通讯 企 ... -
大数据、数据仓库和ETL
2018-07-27 20:50 4392一、背景 大量原来线下的业务电子化之后,产生了 ... -
单机与分布式的组件差异
2018-07-25 15:51 716一、单机程序 1、用内存进程队列实现解耦合和异步 ... -
大数据数据仓库 《大数据之路:阿里巴巴大数据实践》 读书笔记
2018-07-17 18:11 860一、基本概念 1 ... -
ElasticSearch 三 建立索引快的原因
2018-07-09 18:02 838https://blog.csdn.net/u010994 ... -
ElasticSearch 二 查询快的原因
2018-07-09 17:25 2470https://www.jianshu.com/p/ ... -
ElasticSearch 一 基本概念
2018-07-09 17:22 5081、Indices 索引,类似于mysql的Database ... -
后端技术的演化
2018-01-05 18:04 565一、应用分类: 数据库交易类、数据处理(大数据、机器学习、 ... -
pandas 小技巧
2018-01-05 17:34 5951、筛选数据 complaints[['Complaint ... -
区块链技术概览
2017-12-05 16:47 1546区块链技术概览 一、 ... -
区块链技术概览
2017-12-05 16:44 23写道 区块链技术概览 ... -
c++以太坊编译
2017-12-04 16:22 742c++以太坊编译 https://github.com/ ... -
编译solc
2017-12-01 17:27 3660git clone https://github.com/ ... -
深度学习思考和理解 一 统计学和信息论
2017-09-18 11:00 8701、世界是不确定的,所有的函数表达式y=f(x) 只在理论中 ... -
基于camunda的工作流开发
2017-07-11 09:21 14905一、定义 工作流(Wor ... -
数据挖掘概览
2017-06-30 17:22 576数据、信息、知识、智 ... -
服务端相关技术总结
2017-06-16 10:38 440服务端相关技术总结 在实际产品中,主要涉及到的计算 ...
相关推荐
在IT行业中,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它以其高效、轻量级和非阻塞I/O模型而备受推崇,尤其适用于构建网络应用和服务。本专题《深入浅出js(Node.js)异步流程控制》将探讨Node.js中的...
* 学习曲线陡峭: Node.js 的异步机制和事件驱动机制需要开发者具备一定的编程基础和经验。 * 不适合计算密集型应用程序: Node.js 不适合计算密集型应用程序,因为它的单线程模型限制了其计算性能。 Node.js 是一...
Node.js 的核心特性之一是其非阻塞 I/O 模型,这使得 Node.js 在处理大量并发连接时表现出色。v16.16.0 版本继续优化了这一特性,提升了在高并发场景下的性能。此外,Node.js 内置了事件驱动架构,通过事件循环机制...
Node.js 的特点是异步 I/O 模型,事件驱动和非阻塞式 I/O,这使得 Node.js 能够处理高并发请求,且性能非常优越。 Node.js 的应用场景非常广泛,包括 Web 开发、移动应用开发、实时数据处理、游戏开发等。 本教程...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O和事件驱动的模型,为构建高性能的网络应用提供了可能。 Node.js的核心特性包括单线程事件循环、异步编程、模块系统以及强大的文件系统操作等...
讲解可能包括了JavaScript在Node.js中的异步非阻塞I/O模型,事件驱动编程的概念,以及如何安装和设置Node.js环境。 2. **模块系统**:Node.js拥有强大的模块系统,如内置模块(如fs、http)和第三方模块(如Express...
Node.js 是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。10.16.3-x64 版本是 Node.js 的一个稳定版本,适用于64位操作系统。下面将详细...
Node.js 是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。标题“Welcome to Node.js v14.17.6”表明我们将探讨的是Node.js的特定版本——v...
1. **异步编程**:Node.js的核心之一就是异步编程模型,这使得它能够处理大量并发请求,避免了阻塞I/O操作导致的性能瓶颈。书中会深入讲解回调函数、Promise、async/await等异步控制流技术。 2. **事件循环(Event ...
这个"Node.js最新手册"很可能包含了关于Node.js的最新API、模块系统、事件驱动模型以及异步I/O等内容。 在Node.js中,API是应用程序编程接口,它提供了与操作系统、网络、文件系统等交互的工具和方法。例如,`fs`...
Node.js异步编程是JavaScript在服务器端运行的一种技术,它基于Chrome V8引擎,以其事件驱动、非阻塞I/O模型而闻名,极大地提高了网络应用的效率和可扩展性。Node.js的核心特性之一就是它的异步处理能力,这使得...
Node.js采用单线程、事件驱动的非阻塞I/O模型,使其在高并发场景下表现出色,特别适合构建实时通信应用,如聊天服务、协作工具等。 在本书中,你将学习到: 1. **基础篇**:首先会介绍Node.js的基础知识,包括安装...
- **事件驱动模型**:Node.js的核心设计是基于事件驱动的非阻塞I/O模型,这种模型使得Node.js能够高效处理大量并发请求。 - **模块系统**:Node.js内置了强大的模块系统,使用`require`函数可以加载和使用模块,如...
在Node.js环境中,我们可以使用`jsdom`库来模拟浏览器环境执行JavaScript代码,或者使用`xhr`库来异步加载外部脚本。这有助于在服务器端预处理JavaScript,从而提高客户端的加载速度。 3. **resolveHTML(htmlStr)**...
Node.js提供了一个非阻塞I/O模型,使其轻量且高效,特别适合于实时、高并发的网络应用,如聊天室、实时通信应用等。 Node.js的应用场景主要包括以下几个方面: 实时Web应用:由于Node.js的异步和事件驱动的特性,...
Node.js,作为一个基于Chrome V8引擎的JavaScript运行环境,自其诞生以来,就以其高效、异步非阻塞I/O以及事件驱动的特性,迅速在Web开发领域崭露头角。本资料将带你深入探索Node.js的核心思想,并剖析其背后的libuv...
Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让JavaScript开发者可以在服务器端执行代码,打破了传统的JavaScript只能在浏览器端运行的限制。这本《Node.js开发实战详解》电子书,显然是为了帮助那些...