0

0

Node.js代码的执行原理

php中世界最好的语言

php中世界最好的语言

发布时间:2018-03-12 17:08:23

|

1706人浏览过

|

来源于php中文网

原创

这次给大家带来node.js代码的执行原理,node.js代码执行的注意事项有哪些,下面就是实战案例,一起来看一下。

任何一个软件下载安装成功之后,其实只是一堆的机器码,存在我们的电脑的硬盘当中,也就是我们所能看到的一堆的exe文件,当然,有的软件比较大,可能会附带的有一堆的dll文件。

我们有两种方式执行这个软件:

大部分的软件,比如QQ、飞秋、chrome浏览器,我们双击就可以执行运行起来。

有一部分的软件,是需要在命令行里面运行的,比如我们的node.js。

当一个软件被执行的时候,我们的操作系统就会创建一个对应的进程,可以这么理解,进程就是活的软件。

进程与线程

计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行,假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。进程就好比工厂的车间,它代表CPU所能处理的单个任务,任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。一个车间里,可以有很多工人,他们协同完成一个任务。线程就好比车间里的工人,一个进程可以包括多个线程。车间的空间是工人共享的,比如许多房间是每个工人都可以进出的,这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。可是,每间房间的大小不同,有些房间最多能容纳一个人,比如厕所,里面有人的时候,其他的人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这块内存。
一个防止他人进入的简单方法,就是门口加一把锁,先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去,这叫互斥锁。

为什么JavaScript是单线程的?

JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

JavaScript是单线程的,虽然有worker、cluster等可以实现多线程,但是这些都是用来创建功能受限的线程,还是要受主线程的控制,所以,我们就认为JavaScript是单线程的。

另外,我们要明白,JavaScript是单线程的,不代表Node.js也是单线程的,Node.js运行了一个实例之后,是单进程多线程的,这里面,有一个线程负责V8引擎解析JavaScript,有的线程负责libuv,也就是我们理解的事件循环。

如何理解IO:

I代表的是input,输入:比如读一个文件、发起一个ajax请求数据
O代表的是output,输出:比如写文件

同步 vs 异步

像下面这种,不涉及到读写文件、网络请求的、定时器的,全部属于同步代码:

var a = 1;var b = 2;function fn(){}

像下面这种都是属于异步代码:

fs.readFile('./a.js',callback);
fs.writeFile('./b.js',callback);

包括我们在浏览器端看到的一堆的鼠标、键盘事件、ajax等。

Node.js里大部分的涉及异步的对象都是继承自event.eventEmitter事件对象

理解Node.js执行代码的机制

我们可以把Node.js进程想像成一个餐厅:

ecshop
ecshop

本版本全面兼容php5.6+,并且修复了许多官方程序的低级代码bug。在apache 2.4.17+php5.6.15环境下测试通过,人格保证无毒无木马,仅仅是一名ecshop热爱者心血来潮之作。ecshop编译更新日志:1、加入最新官方补丁。2、修改数据库连接底层为mysqli, 现在完美无缺了。3、再次对所有代码进行细节修复。4、adminers更新至1.1.2, 在线管理数据库的神器。5、测

下载

厨师代表的是JavaScript主线程,他不停的忙着把主线程上的同步代码执行下去,直到执行完为止。

//同步代码var a = 1;//同步代码var b = 2;//异步代码fs.readFile('./a.js',function(err,data){    if(err)throw data;
});//同步代码var c = 3;//异步代码setTimeout(function(){
},200);//同步代码console.log(a + b + c);//同步代码function fn(){    console.log('abc');
}//异步代码fs.writeFile('./b.js',myData,function(err){    if(err)throw err;
});

比如像上面的这样的代码,从上往下开始执行,遇到同步代码,直接交给厨师去完成,但遇到了异步的代码的时候,这时候先不执行,而是类似来了新客人一样,交给了我们的服务员,服务员就把这个客人点的菜登记在册,相当于把这个异步代码看成了一个事件,记录到了我们的事件队列当中。

当差不多的时候,同步代码全部执行完了,这时候,主线程就空闲下来了,这时候,会启动我们的事件循环线程,这个事件循环线程就会开始去查看服务员登记的有哪些客人点了菜,然后就会按先后的优先顺序,开始一个客人一个客人的炒他们的菜,也就是执行我们的那些异步代码,因为有很多的客人,每个客人的要求不太一样,就像我们的Node.js代码,有各种各样的异步,比如定时器、读文件、取文件、网络请求,所以Node.js专门有一堆的线程池,处理这些异步代码。

当线程池里的某个线程负责的异步执行完成了之后,相当于这个事件完成了,就会把这个事件对应的回调函数往主线程后面进行排队。

主线程上一旦有了新的要执行的代码,厨师一看有事情要做了,就开始工作了。

如果主线程上执行的回调函数对应的代码,又产生了新的异步代码,那又会登记到事件循环当中。

直到某时刻,事件队列里所有的事件被执行完毕,线程池慢慢的被清空了。

node.js就会调用process.exit(),操作系统销毁当前的这个node.js进程。

理解到上面基本就够了,下面再深入一步:

我们到了学习网络编程那一块的时候,我们知道,我们知道一个服务器容器的时候,除非我们主动的使用CTRL + C把当前的这个进程中止掉,否则会一直的等待客户端的连接并根据相应的路由进行相应的处理。

这个又怎么理解呢?

我们回忆一下我们jQuery里面学的API,事件监听有两种方式:

one 一次性监听

on 无限监听

我们可以这样理解:大部分的文件操作、ajax之类的,其实只需要做一次就会结束,不会再有第二次,他们就相当于one类型的事件模型。

但是如果涉及到网络编程像socket,http之类的,则相当于on无限监听。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

angular独立作用域的使用概念

angularjs中$apply()的使用详解

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

28

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

7

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

8

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

php如何运行环境
php如何运行环境

本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php环境变量如何设置
php环境变量如何设置

本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

0

2026.01.31

php图片如何上传
php图片如何上传

本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

2

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.4万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.6万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号