Я выполняю опрос моего узла/экспресс-приложения, когда запущена вычислительная интенсивная функция. Теперь эта функция блокирует узел/выражение как-то от моментального ответа на запросы http-get; вместо этого эти запросы poller ставятся в очередь и возвращают все после завершения вычисления.Node Express Poller Заблокирован вычислительным интенсивным маршрутом
Есть ли модуль или техника, позволяющие узлу «дышать» и отвечать на HTTP-запросы?
Внутри моей основной маршрут
module.exports.parse = (req, res) ->
# Synchronously Cascading Waterfalls
async.waterfall [
(next) ->
MyOtherOtherModel.findById req.params.id, (err, data) ->
if err
next err
if !data._id
dataError = new Error "Fatal error: Data Result is empty!"
next dataError
next null, data
(data, next) ->
fs.readdir 'uploads', (err, files) ->
if err
next err
next null, data, files
(data, files, next) ->
async.each files, ((file, callback) ->
# Do intensive stuff here, parsing, I/O, mapping, etc
async.waterfall [
(innerNext) ->
MyOtherModel.findByIdAndUpdate data._id,
{ # data
$push:
'uploadedFiles':
fileName: file
length: data.length
},
{ # options
safe: true
upsert: true
new: true
}, (err, dataObjects) ->
if err
innerNext err
innerNext null, dataObjects
(dataObjects, innerNext) ->
async.each items, ((item, innerCallback) ->
MyModel.create myData, (err, result) ->
if err
innerCallback err
innerCallback null
), (err) ->
if err
innerNext err
innerNext null
], (err) ->
if err
callback err
callback null
), (err) ->
if err
next err
# Leave node room to breath, but it isnt working
setTimeout (->
next null
), 1000
], (err) ->
if err
throw Error err # All Errors bubble up to this point
# We return immediately, so that express is free to handle poller requests
res.status(202).send
status: 'OK'
error: 'Started Computation.'
return
Мой Poller
module.exports.poll = (req, res) ->
# Ask DB and calculate finishedPercentage
res.status(206).send
status : 'Partial Content'
type : 'info'
error : percentageFinished + ' % geparsed.'
progress : percentageFinished
Console Output
Parsing..
nextFile..
nextFile..
nextFile..
nextFile..
Progress: 100.0 %
Progress: 100.0 %
...
Таким образом, вы можете видеть, что poller каким-то образом поставлен в очередь, пока Node не подумает о времени ответа на HTTP-запросы. Я хочу, чтобы этот прогресс постоянно обновлялся.
Можете ли вы объяснить «вычислительный интенсивный маршрут?» Что именно он делает? – mscdex
Обновлен мой вопрос с кодом. – nottinhill