我正在使用节点js构建应用程序,该应用程序必须接受用户的请求,读取mongodb并更新特定用户数据,然后再为此特定用户提出请求。我能够使用此代码使用异步队列执行此操作:
//Create a queue with concurrency of 1
var tasksQueue = async.queue(function (userInfo, callback) {
User.verifyAndUpdateAccount(userInfo, callback)
}, 1);
router.post('/', function (req, res, next) {
res.setHeader('Content-Type', 'application/json');
//Is required datas present?
if (!req.body.username || !req.body.password) {
return res.send(null);
}
var username = req.body.username;
var password = req.body.password;
//Verify account informations and update them
tasksQueue.push({username: username, password:password}, function (err,
updatedUser) {
if (err == 'NO_MORE_REQUESTS_ALLOW') {
// S'il ne lui reste plus de sms
return res.send({
code: 400,
message: 'NO_MORE_REQUESTS_ALLOW'
})
} else if (err) throw err;
//**********************************************************
// Build the response here and respond to user requests
})
问题是当我使用模块cluster.js时它不能很好地工作,因为每个线程都有自己的队列而不关心其他线程。我希望我的应用程序能够像这样工作:
想象一下,user1发出了2个请求,之后user2发出了1个请求。假设我有4个核心,我希望我的第一个线程开始处理user1的第一个请求,所有线程等待user1第一个请求被处理后再处理他的第二个请求。但是另一个线程必须能够在处理user1第一个请求之前处理user2请求,因为1个请求只更新mongodb中单个用户的数据并且不会影响其他用户,所以我们不需要等待。
答案 0 :(得分:0)
也许您可以优化代码以使响应处理足够快。但是如果你确实需要一种非阻塞方式来进行繁重的计算,你可以尝试'napajs',这是由微软发布的,它可以与Node.js一起使用,在同一个进程中启用多线程JavaScript场景。这是quick introduction供您参考。
您的代码将如下所示:
> webpack
Hash: 45f5667bd75205a328bf
Version: webpack 3.4.1
Time: 3297ms
Asset Size Chunks Chunk Names
14145c56ece7799954586ba6f8464dbb.png 4.07 kB [emitted]
bundle.js 4.83 MB 0 [emitted] [big] main
[16] (webpack)/buildin/global.js 509 bytes {0} [built]
[37] (webpack)/buildin/module.js 517 bytes {0} [built]
[88] ./src/index.ts 851 bytes {0} [built]
[192] ./src/images/bs.png 82 bytes {0} [built]
+ 189 hidden modules