var http = require(‘http’), fs = require(‘fs’);
http.createServer(function (req, res) { //fs貌似没有推送文件的这个方法。。。 //fs.sendFile(’./index.html’); }).listen(4000);
var data = fs.readFileSync(‘your.html’); res.end(data);
哥们儿,你让他用同步方法,你不是存心害别人么?
@hainee 这里同步、异步都一样
@cloudcome What?怎么会一样呢?
@hainee @anti-peng @cloudcome 依我看,这里同步比异步好啊。
fs.createReadStream(‘your_static_file’).pipe(res);
@alsotang 这里同步为什么比异步好呢?Why?求赐教! 我觉得GuoZhang这样:fs.createReadStream(‘your_static_file’).pipe(res);比较好啊 难道pipe是同步的?
不一样,
readFileSynce
整个文件读完后再 respone
createReadStream('file').pipe(res)
这是chunk,读多少respone多少。
弄个大文件,打开浏览器就一目了然了。
NODEJS主线程是单线程的,之所以支持高并发, 就是使用了异步+回调的方式, 如果你这里使用同步处理文件,那在并发访问的时候,那其它线程可能都会阻塞在主线程。
如果在你的NODE.js主线程中业务逻辑很复杂的时候,那整个网站都会被阻塞在主线程,之所以NODEJS,单线程异步无阻塞,那是因为系统提供了异步+回调的接口,把这些处理交给了底层系统去执行才没有被阻塞, 如果在上面你使用同步可能就会导致被阻塞
个人爱好我也在自学node.js , 这是我对上面的理解,如果理解有错请多指教, 谢谢!
还是得异步 nodejs就是一个单线程任务调度器 如果同步 会造成调度器本身阻塞 这样其他请求就需要等待了吧
要客户端配合,网页上的推送也要看写网页js的人用的方法了,客户端的推送方法案就更多了,直接用socket也可以,了解原理和本质就可以想怎么做就怎么做,能做到最好。
@hainee 我的理解是:本地硬盘读写,异步没有优势,徒增了代码的复杂度。
- 这里阻塞和不阻塞是一样的啊,都是在等待响应结束,并没有阻塞主线程,只是在一个异步(等待响应)里插了一个同步(读取文件)。
- 唯一的区别下面回复已经提到了,那就是内存方式和流的方式,不过这里返回的是html文件,可以忽略啦,不是什么大文件。
- 首次读取的时候,应该缓存起来,下次就直接推了。
@alsotang 那不一定啊,如果使用同步,在读取这个文件的时候,磁盘IO忙,没有及时相应,那么整个系统都会被这个读取给阻塞,导致网站服务暂停响应的!