我正在使用 nodejs 和 expressjs 框架实现一个非常基本的网站。这个想法是,用户进入网站,点击一个按钮,将在服务器中触发一个 CPU 密集型任务,并在任务完成后在浏览器上收到一条消息。
对我来说,令人困惑的部分是如何在不阻塞事件循环的情况下为每个用户完成这项任务,因此,没有用户必须等待另一个完成。此外,如何为每个用户使用所用资源(对象、变量..)的新实例。
在玩耍和阅读之后,我遇到了 child-process。基本上,我想为每个用户分叉一个新的 child_process,这样无论排序需要多长时间,它都不会阻塞我的事件循环。但是,我仍然不确定对于这种情况,这是否是最好的做法。
现在,我已经完成了我想做的事情,但只有一个用户,但是当尝试启动另一个用户时,事情变得混乱并且变量被共享。我知道我不应该使用模块中声明的全局变量,但是还有什么方法可以使单个模块内的函数之间共享变量,但它们对于每个用户都是不同的!?
我知道这个问题可能听起来很基本,但我有点想念 node js 如何为不同的用户提供新的变量,与每个用户关联的对象。
简而言之,我的问题是:1-节点如何同时为多个用户提供服务?2- 我应该何时以及如何在幕后分叉或执行一个新的子进程,是针对每个用户还是基于我在 cpu 中的 # 核心 3- 如何为每个用户分离我的应用程序中的资源,以便每个用户有自己的计数器、电子邮件和其他对象和变量。4-我什么时候需要或者我必须终止我的子进程。
提前致谢。
代码:
var cp = require('child_process');
var child= cp.fork('./routes/mysort-module');
exports.user=function(req,res){
// child = new cp.fork('./routes/mysort-module'); // Should I make new child for each user?
child.on('message',function(m){ res.send('DONE');}
child.send('START PROCESS'); // Forking a cpu-intensive task in mysort-module.js
}
Run Code Online (Sandbox Code Playgroud)
在我的排序模块中:
var variables = require(...);
//GLOBAL VARIABLES to be shared among different functions in this module
process.on('message',function(m){
//sort cpu-intensive task …Run Code Online (Sandbox Code Playgroud)