轻松创建nodejs服务器(7):阻塞操作的实现
2014-12-18 00:00
429 查看
我们来看一下什么是阻塞操作;
我模拟一个sleep()方法来使hello star延迟10秒打印。
requestHandlers.js
请求/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)来实现并行操作,我们应该要充分利用这一点 ―― 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
下一节我们将介绍一下如何实现非阻塞操作。
相关文章推荐
- 轻松创建nodejs服务器(7):阻塞操作的实现
- 轻松创建nodejs服务器(9):实现非阻塞操作
- 轻松创建nodejs服务器(9):实现非阻塞操作
- 轻松创建nodejs服务器(8):非阻塞是如何实现的
- 轻松创建nodejs服务器(8):非阻塞是如何实现的
- ASP.net页面实现MSSQL数据库的创建和操作,是库创建!
- C#编程技巧轻松实现对文件的操作
- 轻松实现一个操作ini文件的类
- 轻松实现一个操作ini文件的类
- 轻松实现一个操作ini文件的类
- 用 Chukeh.dll 轻松实现图片的缩略图,旋转,缩放,剪切,拼合,水印等操作
- asp结合fso实现文件或文件夹创建删除等操作的函数
- C#编程实用技巧:轻松实现对文件的操作
- 轻松实现一个操作ini文件的类
- C#编程技巧轻松实现对文件的操作
- C#提供的类库能够轻松实现对文件的操作
- [VB.NET]利用vb.net创建一个完全可编辑的DataGrid,从而实现操作Access数据库进行增,删,改的功能,前提是不用任何其他的Button
- 轻松实现一个操作ini文件的类
- 轻松实现控件间托拽操作
- 一个javabean轻松实现对数据库的各种操作