NodeJs相关知识

NodeJs 就是运行在服务端的 JavaScript。

NodeJs事件驱动/事件循环:

  • 每个NodeJs进程只有一个主线程在执行程序代码,形成一个执行栈execution context stack)。
  • 主线程之外,还维护了一个"事件队列"(Event queue)。当用户的网络请求或者其它的异步操作到来时,node都会把它放到Event Queue之中,此时并不会立即执行它,代码也不会被阻塞,继续往下走,直到主线程代码执行完毕。
  • 主线程代码执行完毕完成后,然后通过Event Loop,也就是事件循环机制,开始到Event Queue的开头取出第一个事件,从线程池中分配一个线程去执行这个事件,接下来继续取出第二个事件,再从线程池中分配一个线程去执行,然后第三个,第四个。主线程不断的检查事件队列中是否有未执行的事件,直到事件队列中所有事件都执行完了,此后每当有新的事件加入到事件队列中,都会通知主线程按顺序取出交Event Loop处理。当有事件执行完毕后,会通知主线程,主线程执行回调,线程归还给线程池。
  • 主线程不断重复上面的第三步。

NodeJs特点:

  • 它是一个Javascript运行环境
  • 依赖于Chrome V8引擎进行代码解释
  • 事件驱动
  • 非阻塞I/O
  • 轻量、可伸缩,适于实时数据交互应用
  • 单进程,单线程

NodeJs的优缺点:

优点:

  • 高并发;

  • 适合I/O密集型应用。

缺点:

  • 不适合CPU密集型应用,只支持单核CPU,不能充分利用CPU;

  • 单进程,单线程,一旦代码某处出现bug,整个系统都崩溃;

总结:

  • 我们所看到的nodeJs单线程只是一个js主线程,本质上的异步操作还是由线程池完成的,node将所有的阻塞操作都交给了内部的线程池去实现,本身只负责不断的往返调度,并没有进行真正的I/O操作,从而实现异步非阻塞I/O,这便是node单线程和事件驱动的精髓之处了。

  • NodeJs所谓的单线程,只是主线程是单线程,所有的网络请求或者异步任务都交给了内部的线程池去实现,本身只负责不断的往返调度,由事件循环不断驱动事件执行。

  • NodeJs之所以单线程可以处理高并发的原因,得益于libuv层的事件循环机制,和底层线程池实现。

发布了60 篇原创文章 · 获赞 121 · 访问量 7555

猜你喜欢

转载自blog.csdn.net/weixin_46124214/article/details/104424209