`
eric_weitm
  • 浏览: 242665 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

node.js 的异步模型

阅读更多
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()
分享到:
评论

相关推荐

    Node.js-StuQ分享专题《深入浅出jsNode.js异步流程控制》完整版

    在IT行业中,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它以其高效、轻量级和非阻塞I/O模型而备受推崇,尤其适用于构建网络应用和服务。本专题《深入浅出js(Node.js)异步流程控制》将探讨Node.js中的...

    Node.js开发-Node.js入门.pdf

    * 学习曲线陡峭: Node.js 的异步机制和事件驱动机制需要开发者具备一定的编程基础和经验。 * 不适合计算密集型应用程序: Node.js 不适合计算密集型应用程序,因为它的单线程模型限制了其计算性能。 Node.js 是一...

    node.js(v16.16.0) 安装包

    Node.js 的核心特性之一是其非阻塞 I/O 模型,这使得 Node.js 在处理大量并发连接时表现出色。v16.16.0 版本继续优化了这一特性,提升了在高并发场景下的性能。此外,Node.js 内置了事件驱动架构,通过事件循环机制...

    Node.js入门教程.pdf

    Node.js 的特点是异步 I/O 模型,事件驱动和非阻塞式 I/O,这使得 Node.js 能够处理高并发请求,且性能非常优越。 Node.js 的应用场景非常广泛,包括 Web 开发、移动应用开发、实时数据处理、游戏开发等。 本教程...

    Node.js By Example

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O和事件驱动的模型,为构建高性能的网络应用提供了可能。 Node.js的核心特性包括单线程事件循环、异步编程、模块系统以及强大的文件系统操作等...

    node.js 安装包 10.16.3-x64

    Node.js 是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。10.16.3-x64 版本是 Node.js 的一个稳定版本,适用于64位操作系统。下面将详细...

    node.js实战 pdf+源码

    本书的核心内容围绕JavaScript的非阻塞I/O模型,利用Node.js的异步事件驱动架构,来实现高性能的网络应用。以下是基于标题、描述和标签所涵盖的多个关键知识点的详细解释: 1. **Node.js基础**:Node.js是一个基于...

    Welcome to Node.js v14.17.6..zip

    Node.js 是一个开源、跨平台的JavaScript运行环境,它允许开发者在服务器端执行JavaScript代码,极大地拓宽了JavaScript的应用领域。标题“Welcome to Node.js v14.17.6”表明我们将探讨的是Node.js的特定版本——v...

    Node.js硬实战 115个核心技巧.pdf

    1. **异步编程**:Node.js的核心之一就是异步编程模型,这使得它能够处理大量并发请求,避免了阻塞I/O操作导致的性能瓶颈。书中会深入讲解回调函数、Promise、async/await等异步控制流技术。 2. **事件循环(Event ...

    node.js最新手册

    这个"Node.js最新手册"很可能包含了关于Node.js的最新API、模块系统、事件驱动模型以及异步I/O等内容。 在Node.js中,API是应用程序编程接口,它提供了与操作系统、网络、文件系统等交互的工具和方法。例如,`fs`...

    Node.js异步编程

    Node.js异步编程是JavaScript在服务器端运行的一种技术,它基于Chrome V8引擎,以其事件驱动、非阻塞I/O模型而闻名,极大地提高了网络应用的效率和可扩展性。Node.js的核心特性之一就是它的异步处理能力,这使得...

    Node.js 6.x Blueprints(pdf+epub+mobi+code)

    Node.js采用单线程、事件驱动的非阻塞I/O模型,使其在高并发场景下表现出色,特别适合构建实时通信应用,如聊天服务、协作工具等。 在本书中,你将学习到: 1. **基础篇**:首先会介绍Node.js的基础知识,包括安装...

    《Node入门一本全面地Node.js教程》PDF

    - **事件驱动模型**:Node.js的核心设计是基于事件驱动的非阻塞I/O模型,这种模型使得Node.js能够高效处理大量并发请求。 - **模块系统**:Node.js内置了强大的模块系统,使用`require`函数可以加载和使用模块,如...

    node.js时钟案例

    在Node.js环境中,我们可以使用`jsdom`库来模拟浏览器环境执行JavaScript代码,或者使用`xhr`库来异步加载外部脚本。这有助于在服务器端预处理JavaScript,从而提高客户端的加载速度。 3. **resolveHTML(htmlStr)**...

    Node.js(node-v21.6.0.tar.xz)

    Node.js提供了一个非阻塞I/O模型,使其轻量且高效,特别适合于实时、高并发的网络应用,如聊天室、实时通信应用等。 Node.js的应用场景主要包括以下几个方面: 实时Web应用:由于Node.js的异步和事件驱动的特性,...

    Node.js-深入理解Node.js核心思想与源码分析

    Node.js,作为一个基于Chrome V8引擎的JavaScript运行环境,自其诞生以来,就以其高效、异步非阻塞I/O以及事件驱动的特性,迅速在Web开发领域崭露头角。本资料将带你深入探索Node.js的核心思想,并剖析其背后的libuv...

    pdf版,Node.js开发实战详解

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让JavaScript开发者可以在服务器端执行代码,打破了传统的JavaScript只能在浏览器端运行的限制。这本《Node.js开发实战详解》电子书,显然是为了帮助那些...

    Node.js连接OpenGauss异步转同步封装

    在IT行业中,Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它以其高效的非阻塞I/O和事件驱动模型在服务器端编程中受到广泛应用。OpenGauss则是一款开源的关系型数据库管理系统,专为大规模数据处理设计,...

Global site tag (gtag.js) - Google Analytics