博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Node.js事件驱动模型
阅读量:6479 次
发布时间:2019-06-23

本文共 693 字,大约阅读时间需要 2 分钟。

一、传统线程网络模型

       在了解Node.js事件驱动模型之前,我们先了解一下传统的线程网络模型,请求进入web服务器(IIS、Apache)之后,会在线程池中分配一个线程来线性同步完成请求处理,直到请求处理完成并发出响应,结束之后线程池回收。

这就会就会带来以下几个问题 :

1.由于线程池中线程个数有限,对于频繁请求时,就会出现等待,严重的甚至会把服务器挂掉

2.对于高并发的时候,为了防止出现脏数据就会使用锁来解决,一些I/O事务可能消耗很长得时间,这样就会出现一些线程等待,效率低下

二、事件驱动模型

      1.在Node.js中有一个事件队列,每个任务都会放入事件队列中,都会留下处理结果的回调函数,事件循环线程(个人感觉有点类似ios中的RunLoop)处理事件队列中的任务,直到回调函数不再存在。

      2. 在无阻塞的情况下,作为一个带有回调的函数被放入事件队列中,事件循环线程中被提取并执行。

      3.当执行过程中遇到I/O阻塞(读取文件、查询数据库、请求套接字、访问远程服务等)时,事件循环线程不会停下等待结果,转而继续执行队列中的下一个任务,不会在事件循环线程中执行。在函数执行时,Node.js在事件队列中放置回调函数,它的顺序根据函数的完成快慢决定。

      4.在1中也说了当遇到I/O阻塞,循环线程不会等待结果,转而执行队列中的下一个任务,那是该由谁来执行这个I/O操作呢?

Node.js使用事件回调来避免对阻塞I/O的等待,在后台实现线程池,当遇到I/O阻塞任务时,会从线程池中获取一个线程,将该函数及回调在那里执行,在被阻塞的线程上执行的回调函数仍然可以把事件添加到事件队列中。

 

转载地址:http://hzwuo.baihongyu.com/

你可能感兴趣的文章
svn checkout 提示“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”解决方法...
查看>>
【清北学堂2018-刷题冲刺】Contest 8
查看>>
HDU4706 Children's Day
查看>>
Qt线程实现分析-moveToThread vs 继承
查看>>
掌握linux系统防火墙有它就够了
查看>>
查错秘籍—PHP大法
查看>>
Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException
查看>>
第七周进度报告
查看>>
口碑订购会员营销网页无法打开,提示网页可能暂时无法连接
查看>>
Mysql数据库
查看>>
c#入门经典(第三版) 练习4.6(2)
查看>>
07机器学习实战之集成算法(1)
查看>>
在linux上安装rz、sz包
查看>>
第二次实训作业
查看>>
Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块
查看>>
001.为什么选择用AngularJs开发?
查看>>
前端大牛们都学过哪些?
查看>>
Spring MVC概述(2)
查看>>
利用simulink分析系统各种传递函数的BODE图、阶跃响应、单位脉冲响应
查看>>
在iOS当中发送电子邮件和短信
查看>>