轻松创建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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
nodejs实现遍历文件夹并统计文件大小
May 28 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
详解如何在NodeJS项目中优雅的使用ES6
Apr 22 NodeJs
nodejs集成sqlite使用示例
Jun 05 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
浅谈NodeJs之数据库异常处理
Oct 25 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
nodejs基础之buffer缓冲区用法分析
Dec 26 NodeJs
Nodejs实现用户注册功能
Apr 14 NodeJs
NodeJs实现简易WEB上传下载服务器
Aug 10 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 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
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
php创建session的方法实例详解
2015/01/27 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
了解一点js的Eval函数
2012/07/26 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
Seajs的学习笔记
2014/03/04 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
jQuery实现简单的DIV拖动效果
2016/02/19 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
vue2 中如何实现动态表单增删改查实例
2017/06/09 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
微信小程序图片自适应实现解析
2020/01/21 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
用Python编写简单的微博爬虫
2016/03/04 Python
小小聊天室Python代码实现
2016/08/17 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
对Python 文件夹遍历和文件查找的实例讲解
2018/04/26 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
CSS3实现粒子旋转伸缩加载动画
2016/04/22 HTML / CSS
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
日本AOKI官方商城:AOKI西装
2020/06/11 全球购物
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
初中生操行评语大全
2014/04/24 职场文书
热血教师观后感
2015/06/10 职场文书
微信早安问候语
2015/11/10 职场文书
OpenCV-Python实现轮廓拟合
2021/06/08 Python
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers