轻松创建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的10个性能优化技巧
Jul 15 NodeJs
详谈nodejs异步编程
Dec 04 NodeJs
实例详解Nodejs 保存 payload 发送过来的文件
Jan 14 NodeJs
nodejs实现bigpipe异步加载页面方案
Jan 26 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
利用nodejs监控文件变化并使用sftp上传到服务器
Feb 18 NodeJs
配置nodejs环境的方法
May 13 NodeJs
nodejs模块学习之connect解析
Jul 05 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 NodeJs
nodejs中实现用户注册路由功能
May 20 NodeJs
nodejs提示:cross-device link not permitted, rename错误的解决方法
Jun 10 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 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
用Zend Encode编写开发PHP程序
2010/02/21 PHP
php正则表达式(regar expression)
2011/09/10 PHP
PHP数组及条件,循环语句学习
2012/11/11 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
基于jquery的cookie的用法
2011/01/10 Javascript
js日期相关函数总结分享
2013/10/15 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
vue项目打包后打开页面空白解决办法
2018/06/29 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
node.js通过url读取文件
2020/10/16 Javascript
python使用chardet判断字符串编码的方法
2015/03/13 Python
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Python 详解基本语法_函数_返回值
2017/01/22 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Sanic框架蓝图用法实例分析
2018/07/17 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
Python如何执行系统命令
2020/09/23 Python
使用Python爬取Json数据的示例代码
2020/12/07 Python
python基于pexpect库自动获取日志信息
2021/02/01 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
PHP开发工程师面试问题集锦
2012/11/01 面试题
旅游与酒店管理专业求职信
2014/07/21 职场文书
英语邀请函范文
2015/02/02 职场文书
2015年新学期寄语
2015/02/26 职场文书
高中美术教学反思
2016/02/17 职场文书
《雷雨》教学反思
2016/02/20 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
Python基本知识点总结
2022/04/07 Python