Я тестирую потоки, создавая базовый код приложения node.js, который в основном передает файл в ответ. Использование кода от here и here.ответьте на каждый запрос, не дожидаясь окончания текущего потока.
Но если я сделаю запрос от http://127.0.0.1:8000/
, откройте другой браузер и запросите другой файл, второй файл не начнет загружаться до тех пор, пока первый не будет завершен. В моем примере я создал файл размером 1 ГБ. dd if=/dev/zero of=file.dat bs=1G count=1
Но если я прошу еще три файла в то время как первый один загружает, три файла начнет загрузку одновременно, как только первый файл завершен.
Как я могу изменить код так, чтобы он отвечал на каждый запрос, как он сделан, и не нужно дожидаться завершения текущей загрузки?
var http = require('http');
var fs = require('fs');
var i = 1;
http.createServer(function(req, res) {
console.log('starting #' + i++);
// This line opens the file as a readable stream
var readStream = fs.createReadStream('file.dat', { bufferSize: 64 * 1024 });
// This will wait until we know the readable stream is actually valid before piping
readStream.on('open', function() {
console.log('open');
// This just pipes the read stream to the response object (which goes to the client)
readStream.pipe(res);
});
// This catches any errors that happen while creating the readable stream (usually invalid names)
readStream.on('error', function(err) {
res.end(err);
});
}).listen(8000);
console.log('Server running at http://127.0.0.1:8000/');
Какую версию узла вы используете? Потоки изменились с версии v0.10. http://blog.nodejs.org/2012/12/20/streams2/ – Andrew
не так уж важно, потому что я принял ваш ответ, но для записи: 'v0.10.4' – capdragon