您的位置: 翼速应用 > 业内知识 > web前端 > 正文

聊聊nodejs是不是多线程的?

本文来和大家聊聊nodejs是不是多线程的?答:不是,nodejs是单线程的。它采用的是单线程异步非阻塞模式,因为JavaScript引擎的关系,node默认的是单线程,一个nodejs应用无法利用多核资源,能够采用事件驱动和异步“I/O”的方式,实现一个单线程、高并发的运行时环境。


聊聊nodejs是不是多线程的?


本文适用于Windows10系统、nodejs 12.19.0版、Dell G3电脑。


聊聊nodejs是不是多线程的?


答:不是,nodejs是单线程的,它采用单线程异步非阻塞模式。


因为javascript引擎的关系,node默认是单线程,一个node.js应用无法利用多核资源。


Node.js采用事件驱动和异步I/O的方式,实现了一个单线程、高并发的运行时环境,而单线程就意味着同一时间只能做一件事。


nodejs实现异步、非块:


nodejs实际上只有js执行是单线程的,I/O显然是其他线程。


js执行线程是单线程的,只要将所需的I/O传递给libuv,自己马上回来做别的事情,然后libuv在指定的时间回调即可。


详细而言,nodejs首先从js代码中在node-bindings中调用到C/C代码中,然后在C/C代码中封装称为“请求对象”的内容并传递给libuv。 此请求对象中的一些类似于需要执行的功能回调,只需对libuv执行回调,并在执行完毕后实现回调即可。


总之,异步I/O的大致流程如下:


1、启动I/O呼叫


用户从Javascript代码中调用Node核心模块,并将参数和回调函数传递给核心模块


Node核心模块将传递的参数和回调函数封装在请求对象中。


将此请求对象推送至I/O线程池以等待运行;


Javascript异步调用结束,Javascript线程继续执行后续操作。


2、执行回调


I/O操作完成后,将检索以前封装在请求对象中的回调函数,并执行该函数以实现Javascript回调的目的。 (此处回调的详细情况在以下说明)


从这里可以看出,我们其实一直对Node.js的单线程有所误解。


实际上,单线程是指Javascript运行时环境中的单线程,Node.js没有在运行Javascript时创建新线程的能力。 最终的实际操作仍然在Libuv及其事件循环中执行。 这就是为什么Javascript单线程语言可以在Node.js中实现异步操作的原因。 两者不会冲突。


扩展知识:


Node.js多线程概述


有人可能会说,Node.js虽然是单线程的,但是可以利用循环事件(Event Loop)l来实现并发执行任务。追究其本质,NodeJs实际上使用了两种不同的线程,一个是用于处理循环事件的主线程一个是工作池(Worker pool)里面的一些辅助线程。关于这两种线程主要功能和关系如图


Node.js多线程概述



以上就是关于nodejs是不是多线程的全部解析,翼速应用平台内有更多相关资讯,欢迎查阅!

我来说两句

0 条评论

推荐阅读

  • 响应式布局CSS媒体查询设备像素比介绍

    构建响应式网站布局最常见的是流体网格,灵活调整大小的站点布局技术,确保用户在使用的幕上获得完整的体验。响应式设计如何展示富媒体图像,可以通过以下几种方法。

    admin
  • 提升网站的性能快速加载的实用技巧

    网站速度很重要,快速加载的网站会带来更好的用户体验、更高的转化率、更多的参与度,而且在搜索引擎排名中也扮演重要角色,做SEO,网站硬件是起跑线,如果输在了起跑线,又怎么跟同行竞争。有许多方法可提升网站的性能,有一些技巧可以避免踩坑。

    admin
  • 织梦CMS TAG页找不到标签和实现彩色标签解决方法

    织梦cms是我们常见的网站程序系统的一款,在TAG标签中常常遇到的问题也很多。当我们点击 tags.php 页的某个标签的时候,有时会提示:“系统无此标签,可 能已经移除!” 但是我们检查程序后台,以及前台显示页面。这个标签确实存在,如果解决这个问题那?

    admin
  • HTML关于fieldset标签主要的作用

    在前端开发html页面中常用的标签很多,今天为大家带来的是关于HTML中fieldset标签主要的作用说明,根据技术分析HTML

    admin

精选专题