我正在使用nodejs和expressjs框架实现一个非常基本的网站。这个想法是用户进入网站,点击一个按钮,该按钮将触发服务器中的cpu密集型任务,并在完成任务后在浏览器上收到消息。
对我来说,令人困惑的部分是如何在不阻塞事件循环的情况下为每个用户完成此任务,因此,没有用户必须等待另一个用户完成。此外,如何为每个用户使用已使用资源(对象,变量..)的新实例。
在玩耍和阅读后,我遇到了儿童过程。基本上,我想为每个用户分配一个新的child_process,这样无论排序采取什么时间,它都不会阻止我的事件循环。但是,我仍然不确定这对于这种情况是否是最好的做法。
现在,我已经完成了我想要的但只有一个用户,但是当尝试启动另一个用户时,事情变得混乱并且变量被共享。我知道我不应该使用模块中声明的全局变量,但是在单个模块中的函数之间共享变量的另一种方法是什么,但它们对于每个用户都是不同的??
我知道这个问题可能听起来非常基本,但我有点想念节点j如何使用新变量(与每个用户相关联的对象)为不同用户服务。
简而言之,我的问题是: 1-节点如何同时为多个用户服务? 2-何时以及如何在引擎盖下使用分叉或执行新的子进程,它是针对每个用户还是基于我在cpu中的#core 3-如何在每个用户的应用程序中分离资源,以便每个用户都有自己的计数器,电子邮件和其他对象和变量。 4-我什么时候需要或者我必须杀死我的孩子。
提前致谢。
CODE:
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
}
在我的分类模块中:
var variables = require(...);
//GLOBAL VARIABLES to be shared among different functions in this module
process.on('message',function(m){
//sort cpu-intensive task
process.send('DONE');
});
// OTHER FUNCTIONS in THE MODULE that make use of global variables.
答案 0 :(得分:2)
你应该尝试分开你的问题。但是,我希望这能解决它。
问题1:全局变量不仅限于请求范围。这是Node对全局定义的一部分,并且以某种方式强制执行此操作没有意义。你根本不应该使用全局变量。
请求范围由HTTP模块提供:
http.createServer(function(req, res) {
var a = 1;
// req, res, and a are in request scope for your user-associated response
});
消除全局变量不应该那么难:如果模块A和B共享全局G而模块C调用A.doThis()和B.doThat(),则更改C以调用A.doThis(G)和B. doThat(G)代替。对所有出现的G执行此操作,并将其范围缩小到本地或请求。
此外,如果您需要来自一个客户的多个请求的范围,请查看“会话”。
问题2:在请求处理程序中启动子进程:
exports.user = function(req,res){
child = new cp.fork('./routes/mysort-module');
问题3:请参阅问题1?
问题4:在流程返回计算结果后。
process.on('DONE', function(result) {
process.exit();
// go on and send result to the client somehow...
});