Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
В случае, если при прохождении цикла оказалось, что ни одна функция не установлена с помощью process.nextTick(), нет ни одного таймера и очереди запросов в libev и libeio пусты, то node завершает работу.Node наверное работу не завершает, просто Loop завершается…
Таким образом, время обработки будет равняться min(Tread, Tcalc), а не (Tread + Tcalc)Что то не вызывает доверия это утверждение. Что такое время обработки? Через сколько клиент получит ответ? Да через столько же т.к. пока вы файл не загрузите, калькуляции вы над ним не проведете.
Node наверное работу не завершает, просто Loop завершается
Node наверное работу не завершает, просто Loop завершается…Наверное, это вопрос терминологии, считать ли момент ожидания событий честью цикла. По идее, нужно, тогда наши с вами утверждения идентичны, разве нет? :)
А есть ли в Node способ считывать файл не целиком а по кусочкам? По крайней мере ваши функции хеширования можно применять не ко всему файлу а к его кусочкам с таким же результатом, считывая кусочки файла и хешируя их, так сказать, «в конвейерном режиме».Да, можно считывать по частям. Я старался не касаться этого вопроса в статье, обсуждая наиболее часто возникающие вопросы.
Что то не вызывает доверия это утверждение. Что такое время обработки? Через сколько клиент получит ответ? Да через столько же т.к. пока вы файл не загрузите, калькуляции вы над ним не проведете.Согласен с вами, некорректно оценил время. Тем не менее, если представить себе одновременный приход двух запросов, то возможен случай, когда будет инициализировано чтение двух файлов, далее один из них прочитается, обработается и результат вернётся клиенту, а потом будет обработан второй файл. В этом случае второй клиент получит результат раньше, чем при синхронной реализации сервера.
А есть ли в Node способ считывать файл не целиком а по кусочкам? По крайней мере ваши функции хеширования можно применять не ко всему файлу а к его кусочкам с таким же результатом, считывая кусочки файла и хешируя их, так сказать, «в конвейерном режиме».
fs.createReadStream('sample.txt', {start: 90, end: 99});
Но что делать, если время обработки файла сильно больше времени чтения файла и кроме того сильно флуктуирует?В этом случае надо НЕиспользовать асинхронный сервер)))
var content
setTimeout(function(){
if(файл изменён) загрузитьфайл(файл, function() {content = вычислитьхеш()})
})
server.(){
write (content)
}).listen(8080)
сгенерировать_контент()
записать_файл()
отослать_и_закрыть_соединение()
сгенерировать_контент()
nextTick(function(){записать_файл()});
отослать_и_закрыть_соединение()
сгенерировать_контент() отослать_и_закрыть_соединение() записать_файл()
res.end(data);Вторые должны разруливаться асинхронными вызовами — ну это одна из задач ноды.
var Sync = require('sync');
http.createServer(function (req, res) {
// Very simple and dangerous check
var filename = req.url.replace(/\?.*/, '').replace(/(\.\.|\/)/, '');
// Start new fiber
Sync(function(){
// Read file from disk
var filecontent = fs.readFile.sync(fs, filename, 'utf8');
var str = func1_cb.sync(null, filecontent);
var hash = func2_cb.sync(null, str);
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(hash);
}, function(err){
// Error handling
if (err) {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end(err);
}
})
}).listen(8124, "127.0.0.1");
Асинхронное программирование, коллбеки и использование process.nextTick()