资讯专栏INFORMATION COLUMN

快速学习nodejs系列:四、nodejs特性1--单线程

cgspine / 2009人阅读

摘要:特性单线程说明也许你会问,为什么还不安装还不写代码还不讲模块前面我说过,不会一来就。另外,单线程中,操作系统没有创建销毁线程的时间开销。单线程缺点如果有用户造成线程崩溃,那个整个系统都崩溃了。

nodejs特性1--单线程

说明:也许你会问,为什么还不安装nodejs?还不写代码?还不讲模块?前面我说过,不会一来就hello world。而是会先跟大家讲讲nodejs的特点,只有大家明白、理解nodejs的特点,在后面的模块学习中,会有种豁然开朗的感觉,也会更加明白为什么nodejs会这样设计;比起一上来就看文档、写代码更加事半功倍;比起代码层面的东西,原理更为重要!

在php,java语言中,会为每一个客户端连接都创建一个新的线程。以php(php-fpm、单进程单线程)为例,每一个php-fpm工作线程大概消耗20M内存,一个8G的服务器,大概同时支持400个左右客户端连接。要想支持更加多的客户端连接,只能增加服务器数量,这样一来硬件的费用成本就上来了。

在nodejs始终只有唯一一个线程,它不为每一个客户端的连接新开线程。据某些测试,一个8G内存的服务器同时支持4万了连接。nodejs通过自己内部事件机制、异步I/O,在宏观上达到并行。

例子说明:
如一个任务中有3个线程;
在多线程中(图1),它3个线程是同时并行的,但由于每个线程中都有I/O操作,都要等阻塞I/O完成后才能进行下面的程序。


图1

在Nodejs单线程中,首先会把所有要执行的线程放到“事件栈”中,在开始执行第一个线程后,遇到I/O时,会马上把当前的I/o操作放到事件栈中并开始执行线程2;当线程1的I/O执行完成后,程序会回到线程1,并执行线程1的程序2;当线程2中遇到I/O,也会放到事件栈中;程序转而去处理其他;就是这样的循环,让程序达到并行效果,这个线程的利用率是100%的。


图2

如果你还不明白的话,我们可以用生活的例子来进一步说明:餐厅和服务员的关系;多线程--招很多个服务员,每个服务员干特定的活(点菜、冲茶、收桌子),干完自己的活后可以休息;而单线程--只招了一个服务员,所有的活都有他自己一个人干,干什么他自己决定,甚至点菜干到一半,去把冲茶干完后,再回来继续点菜也可以。

另外,单线程中,操作系统没有创建、销毁线程的时间开销。
单线程缺点:如果有用户造成线程崩溃,那个整个系统都崩溃了。(不过nodejs很难崩溃,会有相应的错误事件处理)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93149.html

相关文章

  • 快速学习nodejs系列:六、nodejs特性3--事件驱动

    摘要:事件驱动在中,当某个执行完毕后,会以事件的形式通知执行操作的线程而线程去执行对应事件的回调函数。为了处理异步,线程必须要有事件循环,不断的检查有没有事件要处理,并依次处理。其实在底层中,有一半的代码,都是在处理事件队列回调函数。 事件驱动 上一节中,我们提到异步I/O;当I/O处理完毕后,nodejs是怎样知道I/O已经完成了呢?又是怎样去处理的呢?答案是:事件驱动(事件循环)机制。 ...

    ashe 评论0 收藏0
  • 快速学习nodejs系列:五、nodejs特性2--非阻塞I/O

    摘要:非阻塞下面我们继续看看的第个特性非阻塞异步首先,看看什么是非阻塞呢操作,在程序中我们可以广泛的认为是从数据库读数据从硬盘上读写文件等。当处理完毕后,是怎样知道该完成了这里就要说到第个特性了事件驱动。 非阻塞I/O 下面我们继续看看,nodejs的第2个特性--非阻塞I/O(异步I/O) 首先,看看什么是非阻塞I/O呢?I/O操作,在程序中我们可以广泛的认为是:从数据库读数据、从硬盘上读...

    Baaaan 评论0 收藏0
  • 快速学习nodejs系列:三、nodejs是什么

    摘要:是什么官网上的定义翻译过来是一个基于引擎的运行环境。使用了一个事件驱动非阻塞式的模型,使其轻量又高效。的包管理器,是全球最大的开源库生态系统。的特点非常重要单线程事件驱动事件循环非阻塞异步所谓的特点,就是是怎样解决服务器高性能的问题。 nodejs是什么 nodejs官网(nodejs.org)上的定义:Node.js® is a JavaScript runtime built on...

    zilu 评论0 收藏0
  • nodejs 基础篇整合

    摘要:基础篇整合最近有朋友也想学习相关方面的知识,如果你是后端想接近前端,作为一门跑在服务端的语言从这里入门再好不过了。事件驱动机制是通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文的切换。 nodeJs 基础篇整合 最近有朋友也想学习nodeJs相关方面的知识,如果你是后端想接近前端,node作为一门跑在服务端的JS语言从这里入门再好不过了。如果你正好喜欢前端,...

    lemanli 评论0 收藏0
  • nodejs 基础篇整合

    摘要:基础篇整合最近有朋友也想学习相关方面的知识,如果你是后端想接近前端,作为一门跑在服务端的语言从这里入门再好不过了。事件驱动机制是通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文的切换。 nodeJs 基础篇整合 最近有朋友也想学习nodeJs相关方面的知识,如果你是后端想接近前端,node作为一门跑在服务端的JS语言从这里入门再好不过了。如果你正好喜欢前端,...

    lentrue 评论0 收藏0

发表评论

0条评论

cgspine

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<