轻松创建nodejs服务器(7):阻塞操作的实现


Posted in NodeJs onDecember 18, 2014

我们来看一下什么是阻塞操作;

我模拟一个sleep()方法来使hello star延迟10秒打印。

requestHandlers.js

function start() {

  console.log("Request handler 'start' was called.");

  function sleep(milliSeconds) {

 var startTime = new Date().getTime();

 while (new Date().getTime() < startTime + milliSeconds);

  }

  sleep(10000);

  return "Hello Start";

}

 

function upload() {

  console.log("Request handler 'upload' was called.");

  return "Hello Upload";

}

 

exports.start = start;

exports.upload = upload;

请求/start的时候,延迟了10秒才打印。

请求/upload的时候,并不会受影响。

接下来做一个试验:

在第一个浏览器窗口的地址栏中输入 http://localhost:8888/start,但是先不要打开它!

在第二个浏览器窗口的地址栏中输入 http://localhost:8888/upload,同样的,先不要打开它!

我们在第一个窗口中(“/start”)按下回车,然后快速切换到第二个窗口中(“/upload”)按下回车。

注意,发生了什么:

/start URL 加载花了 10 秒,这和我们预期的一样。

/upload URL 居然也花了 10 秒!

可以它在对应的请求处理程序中并没有类似于 sleep()这样的操作啊,这是什么问题?

原因就是start()包含了阻塞操作。形象的说就是“它阻塞了所有其他的处理工作”。

Node.js 是单线程的,它可以在不新增额外线程的情况下对任务进行并行处理。

它通过事件轮询(event loop)来实现并行操作,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。

下一节我们将介绍一下如何实现非阻塞操作。

NodeJs 相关文章推荐
Nodejs进程管理模块forever详解
Jun 01 NodeJs
Nodejs+express+html5 实现拖拽上传
Aug 08 NodeJs
nodejs中实现路由功能
Dec 29 NodeJs
NodeJS中Buffer模块详解
Jan 07 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
CentOS 安装NodeJS V8.0.0的方法
Jun 15 NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 #NodeJs
轻松创建nodejs服务器(9):实现非阻塞操作
Dec 18 #NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 #NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 #NodeJs
轻松创建nodejs服务器(4):路由
Dec 18 #NodeJs
轻松创建nodejs服务器(3):代码模块化
Dec 18 #NodeJs
轻松创建nodejs服务器(2):nodejs服务器的构成分析
Dec 18 #NodeJs
You might like
十天学会php(2)
2006/10/09 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
基于JavaScript实现定时跳转到指定页面
2016/01/01 Javascript
jQuery 监控键盘一段时间没输入
2016/04/22 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
Angularjs 制作购物车功能实例代码
2016/09/14 Javascript
Jquery UI实现一次拖拽多个选中的元素操作
2020/12/01 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
Vue加载组件、动态加载组件的几种方式
2018/08/31 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
JavaScript Dom实现轮播图原理和实例
2021/02/19 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
python中迭代器(iterator)用法实例分析
2015/04/29 Python
Python切片知识解析
2016/03/06 Python
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
Python的argparse库使用详解
2018/10/09 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
通过python3实现投票功能代码实例
2019/09/26 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
彪马英国官网:PUMA英国
2019/02/11 全球购物
银行实习自我鉴定
2013/10/12 职场文书
岗位职责风险点
2014/03/12 职场文书
开学寄语大全
2014/04/08 职场文书
给老婆的保证书
2015/01/16 职场文书
高中物理教学反思
2016/02/19 职场文书