轻松创建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 相关文章推荐
使用forever管理nodejs应用教程
Jun 03 NodeJs
轻松创建nodejs服务器(6):作出响应
Dec 18 NodeJs
nodejs修复ipa处理过的png图片
Feb 17 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
Nodejs进阶:核心模块net入门学习与实例讲解
Nov 21 NodeJs
详解nodejs微信公众号开发——3.封装消息响应模块
Apr 10 NodeJs
详解Nodejs之npm&amp;package.json
Jun 15 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
NodeJS实现一个聊天室功能
Nov 25 NodeJs
Nodejs 数组的队列以及forEach的应用详解
Feb 25 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性能优化大全(php.ini)
2016/05/20 PHP
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
JavaScript中Boolean对象的属性解析
2015/10/21 Javascript
简单的分页代码js实现
2016/05/17 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jquery pagination插件动态分页实例(Bootstrap分页)
2016/12/23 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
2017/03/08 Javascript
老生常谈js数据类型
2017/08/03 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
详解webpack自定义loader初探
2018/08/29 Javascript
[02:44]DOTA2英雄基础教程 钢背兽
2013/12/19 DOTA
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
简析Python的闭包和装饰器
2016/02/26 Python
python记录程序运行时间的三种方法
2017/07/14 Python
Django中的forms组件实例详解
2018/11/08 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
python+django+rest框架配置创建方法
2019/08/31 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
flask开启多线程的具体方法
2020/08/02 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
浅析python 字典嵌套
2020/09/29 Python
html5/css3响应式页面开发总结
2018/10/16 HTML / CSS
HTML5 video 视频标签使用介绍
2014/02/03 HTML / CSS
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
JPA面试常见问题
2016/11/14 面试题
如何编写优秀的食品项目创业计划书
2014/01/23 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
药店促销活动策划方案
2014/08/24 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
用Python提取PDF表格的方法
2021/04/11 Python
golang正则之命名分组方式
2021/04/25 Golang