轻松创建nodejs服务器(8):非阻塞是如何实现的


Posted in NodeJs onDecember 18, 2014

这节我们来了解一下nodejs实现非阻塞操作的方法。

我们先来修改一下 start的处理程序:

var exec = require("child_process").exec;

function start() {

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

  var content = "empty";

  exec("ls -lah", function (error, stdout, stderr) {

 content = stdout;

  });

  return content;

}

 

function upload() {

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

  return "Hello Upload";

}

 

exports.start = start;

exports.upload = upload;

这段代码,创建了一个新的变量content(初始值为“empty”),执行“ls -lah”命令,将结果赋值给content,最后将content返回。

我们引入了一个新的Node.js模块,child_process,之所以用它,是为了实现一个既简单又实用的非阻塞操作:exec()。

那么exec()做了什么呢?

它从Node.js来执行一个shell命令。在上面的例子里,我们用它来获取当前目录下所有的文件(“ls -lah”),然后,当/startURL请求的时候将文件信息输出到浏览器中。

我们启动服务器,访问“http://localhost:8888/start”我们会发现页面输出的内容是 empty。

exec()发挥作用了,有了它,我们可以执行非常耗时的shell操作而无需迫使我们的应用停下来等待该操作。

虽然如此,但是页面输出的内容似乎不是我们想要的结果。

我们来分析一下原因:

我们的代码是同步执行的,这就意味着在调用exec()之后,Node.js会立即执行 return content ;

在这个时候,content仍然是“empty”,因为传递给exec()的回调函数还未执行到——因为exec()的操作是异步的。

下一节我们将介绍如何解决这个问题。

NodeJs 相关文章推荐
nodejs教程之异步I/O
Nov 21 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
详解Windows下安装Nodejs步骤
May 18 NodeJs
Nodejs中Express 常用中间件 body-parser 实现解析
May 22 NodeJs
ajax +NodeJS 实现图片上传实例
Jun 06 NodeJs
nodejs操作mongodb的填删改查模块的制作及引入实例
Jan 02 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
nodejs微信开发之接入指南
Mar 17 NodeJs
详解微信小程序-获取用户session_key,openid,unionid - 后端为nodejs
Apr 29 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
Nodejs异步流程框架async的方法
Jun 07 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
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 #NodeJs
You might like
php adodb连接mssql解决乱码问题
2009/06/12 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
PHP及Zend Engine的线程安全模型分析
2011/11/10 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
PHP的mysqli_set_charset()函数讲解
2019/01/23 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法
2014/11/03 Javascript
全屏js头像上传插件源码高清版
2016/03/29 Javascript
js操作数据库实现注册和登陆的简单实例
2016/05/26 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
js自定义QQ菜单效果
2017/01/10 Javascript
canvas仿iwatch时钟效果
2017/03/06 Javascript
详解VUE前端按钮权限控制
2019/04/26 Javascript
layui多图上传实现删除功能的例子
2019/09/23 Javascript
Vue退出登录时清空缓存的实现
2019/11/12 Javascript
Python切片知识解析
2016/03/06 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法
2020/03/19 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
通过自学python能找到工作吗
2020/06/21 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
医学专业大学生求职的自我评价
2013/11/27 职场文书
心得体会开头
2014/01/01 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
教师产假请假条范文
2014/04/10 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
2015共产党员公开承诺书
2015/01/22 职场文书
天下第一关导游词
2015/02/06 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang