节点js异步队列和多线程

时间:2017-08-06 08:43:30

标签: node.js multithreading mongodb

我正在使用节点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中单个用户的数据并且不会影响其他用户,所以我们不需要等待。

1 个答案:

答案 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