为什么要使用Node

2022-02-14 16:15:37 浏览数 (1)

目录

  • Node能够解决什么问题
    • 什么是进程
    • 什么是线程
    • 什么是多线程
      • 多线程的优势
      • 多线程的劣势
    • 什么是单线程
    • 同步和异步
    • 同步异步/阻塞非阻塞
    • Node是什么
    • Node使用场景

Node能够解决什么问题

  • Java是多线程语言,在处理高并发上存在一定短板;Node是单线程的,可以很好的处理这个问题。
  • 说到线程,那么再讲下进程和线程的概念以及区别。
什么是进程

当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。

而一个进程又是由多个线程所组成的。

什么是线程

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

什么是多线程

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的优势

可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待, 这样就大大提高了程序的效率。

多线程的劣势
  • 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
  • 多线程需要协调和管理,所以需要CPU时间跟踪线程;
  • 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
  • 线程太多会导致控制太复杂,最终可能造成很多Bug;
什么是单线程

顾名思义,一个程序中只有一个线程,任何操作都基于此线程,那么就存在一个阻塞问题。

同步和异步

同步和异步关注的是消息通知机制

  • 同步就是发出调用后,没有得到结果之前,该调用不返回,一旦调用返回,就得到返回值了。 简而言之就是调用者主动等待这个调用的结果
  • 而异步则相反,调用者在发出调用后这个调用就直接返回了,所以没有返回结果。换句话说当一个异步过程调用发出后,调用者不会立刻得到结果,而是调用发出后,被调用者通过状态、通知或回调函数处理这个调用。
同步异步/阻塞非阻塞

上面是书本上比较枯燥的概念,下面举一个生活中的例子便于理解同步异步和阻塞非阻塞的关系。

现在有一个场景,一个男生当面向一个女生表白。在程序中男生对应着客户端即调用者,女生对应着服务端即被调用者。

男生向女生表白后可能发生如下几种情况:

  • 女生说你等着我一会给你答复。这个等着的过程对于女生(被调用者)来说是同步的,但是对于男生(调用者)来说就是阻塞的。
  • 女生说你先回去干别的事儿,我思考两天再给你答复。这两天对于女生(被调用者)来说是异步的,对于男生(调用者)来说也就是非阻塞的,他可以在此期间再向别的女生表白或干别的事儿,等女生想好了再通知他。

上面说到同步阻塞、异步非阻塞,当然还有另外两种情况(同步非阻塞、异步阻塞),我们在此暂不讨论。

Node是什么

在Node中写了一个libuv库,采用了异步非阻塞的思想,底层实际上使用了多线程来实现的。

Node使用了事件驱动、非阻塞式I/O的模型,使其轻量又高效

Node能火起来最大的一个原因在于包管理器npm,它是全球最大的开源库生态系统。

Node使用场景

  • 现在各个公司都在主推的前后端分离中,使用Node做中间层。
    • 前后端分离,那就必然存在跨域问题,使用Node做一层接口封装,这个过程不会跨域,Node也在前端控制,对于前端也不会跨越。即解决跨域问题。
    • 当然还能通过Nginx解决跨域问题。引入Node也主要是为了让后端职责更专注于逻辑处理,对于一些数据转换完全可以交由前端处理,使得职责更加分明。
  • 当应用程序需要处理高并发场景时,多线程语言中如Java会耗费大量内存,是并不推荐的。
    • 聊天服务器:大量并发的输入输出
    • 电子商务网站:无过复杂逻辑,大量并发的输出(大量用户同一时间浏览网站)

Node基础

todo

  • nrm
  • nvm

Node系列-下一节事件循环详解

0 人点赞