轻松创建nodejs服务器(7):阻塞操作的实现
作者:bea
我们来看一下什么是阻塞操作; 我模拟一个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(
我们来看一下什么是阻塞操作;
我模拟一个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)来实现并行操作,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
下一节我们将介绍一下如何实现非阻塞操作。
有用 | 无用
我模拟一个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)来实现并行操作,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
下一节我们将介绍一下如何实现非阻塞操作。
有用 | 无用
猜你喜欢
您可能感兴趣的文章:
- 零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
- jQuery多媒体插件jQuery Media Plugin使用详解
- jquery图片播放浏览插件prettyPhoto使用详解
- js中匿名函数的创建与调用方法分析
- 浅谈Javascript中匀速运动的停止条件
- 浅谈Javascript如何实现匀速运动
- Javascript添加监听与删除监听用法详解
- Javascript 实现图片无缝滚动
- 使用JavaScript获取地址栏参数的方法
- JS获取各种宽度、高度的简单介绍
- JQuery右键菜单插件ContextMenu使用指南
- 简单谈谈jQuery(function(){})与(function(){})(jQuery)
- jQuery多级弹出菜单插件ZoneMenu
- 使用jquery菜单插件HoverTree仿京东无限级菜单
- jQuery实现视频作为全屏幕背景
- JS实现判断滚动条滚到页面底部并执行事件的方法
- 轻松创建nodejs服务器(10):处理上传图片
- 轻松创建nodejs服务器(10):处理POST请求
- 浅析jQuery EasyUI中的tree使用指南