我意识到节点是非阻塞的,但是,我也意识到因为节点只有一个线程,所以在事件循环中间放置一个三秒的while循环将导致阻塞。即:
var start = new Date();
console.log('Test 1');
function sleep(time, words) {
while(new Date().getTime() < start.getTime() + time);
console.log(words);
}
sleep(3000, 'Test 2'); //This will block
console.log('Test 3') //Logs Test 1, Test 2, Test 3我见过的许多处理新的"Streams2“接口的例子看起来都会导致同样的阻塞。例如,这个是从here借来的
var crypto = require('crypto');
var fs = require('fs');
var readStream = fs.createReadStream('myfile.txt');
var hash = crypto.createHash('sha1');
readStream
.on('readable', function () {
var chunk;
while (null !== (chunk = readStream.read())) {
hash.update(chunk); //DOESN'T This Cause Blocking?
}
})
.on('end', function () {
console.log(hash.digest('hex'));
});如果我没看错的话,当缓冲区中有数据时,readStream将发出readable事件。因此,似乎一旦发出readable事件,整个事件循环就会停止,直到readStream.read()发出null。这似乎比旧方法更不可取(因为它不会阻塞)。有人能告诉我为什么我错了吗?谢谢。
发布于 2015-01-03 08:25:57
在内部流缓冲区为空之前,您不必进行读取。如果你愿意,你可以只读一遍,然后再读另一段。
readStream.read()本身不是阻塞的,但hash.update(chunk) (在短时间内)是阻塞的,因为散列是在主线程上完成的(尽管在线程池中添加执行加密函数的异步接口存在github问题)。
此外,您还可以简化使用加密流接口所需的代码:
var crypto = require('crypto'),
fs = require('fs');
var readStream = fs.createReadStream('myfile.txt'),
hasher = crypto.createHash('sha1');
readStream.pipe(hasher).on('readable', function() {
// the hash stream automatically pushes the digest
// to the readable side once the writable side is ended
console.log(this.read());
}).setEncoding('hex');发布于 2015-01-03 15:58:41
所有JS代码都是单线程的,因此循环将阻塞,但您误解了该循环将运行多长时间。调用.read()会从流中获取一个可读的项,就像使用该项调用“data”处理程序一样。一旦没有项目,它就会停止执行并解除阻塞。只要有数据就会触发“readable”,然后清空缓冲区并等待另一个“readable”。因此,当您的第一个while循环依赖于要更新的时间时,另一个循环基本上是在执行以下操作:
while (items.length > 0) items.pop()这几乎是处理流中的项所需的最小工作量。
https://stackoverflow.com/questions/27750297
复制相似问题