锁定存储在 req.session 中的变量,或者创建一个巨大的全局变量?
Lock a variable stored in req.session, or make a huge global var?
我正在 node.js 编写游戏,基本上,你发送任务中的单位并等待他们 return。当然,你不能在两个任务中派出同一个单位,也不能在同一个任务中派出两套单位。
玩家拥有的每个单位都存储在req.session(快速会话)中,所以在开始任务之前,我检查它们是否在使用中,如果是,则中止任务,如果空闲,标记它们在使用中并继续。
这就是问题所在,我不知道 req.session 是否共享,或者每条路线是否都有自己的副本,并且无法可靠地将它们标记为正在使用。
我试过信号量(npm 模块'locks'),但结果是一样的。
这里是(截取相关部分)日志:
E:\Documents\GIT\_>node app.js
2015/6/15 23:51:55:582 /start get
2015/6/15 23:51:55:582 /start parameters:
squad: 0,1
mission: 1
2015/6/15 23:51:55:612 start_miss squad locked
2015/6/15 23:51:55:613 start_miss Waiting
2015/6/15 23:51:56:73 /start parameters:
squad: 0,1
mission: 1
2015/6/15 23:51:56:75 start_miss squad locked
2015/6/15 23:51:56:76 start_miss Waiting
2015/6/15 23:51:56:625 end_missio End mission
2015/6/15 23:51:57:88 end_missio End mission
这是我的 "lock_squad" 代码:
function lock_unit(req, squad, callback, i) {
setImmediate(function () {
if(!i) {i = 0;}
log(log_level['DEBUG'], 'lock_unit', 'start ' + (i + 1) + ' / ' + squad.length);
if(i < squad.length) {
search_id(req.session.units, squad[i], function (id) {
req.session.units[id].deployed = true;
lock_unit(req, squad, callback, i + 1);
});
} else {
callback();
}
});
}
基本上,问题是:
如何锁定一个变量(存储在会话中的数组中的元素),以便在处理请求之前该对象不能被另一个或同一路由使用?
编辑:
似乎 req 是一个副本,所以我应该更改我的实现以给每个会话一个 id,并将该 id 用于 link 包含每个会话的每个单元的全局变量,并锁定它.这对我来说似乎是个坏主意,因为要么节点进程会占用大量内存,要么我需要手动创建一个 "garbage collector",每个陷阱都会产生。
有人有更好的主意吗?
在 res.end()
上快速保存会话,在我的例子中,这是在看到第二个请求后很长时间才发送的。
这意味着我仍然需要锁定会话(a la redis-lock,需要找到 mongoDB 等价物),并在开始计算战斗之前结束 res。
我正在 node.js 编写游戏,基本上,你发送任务中的单位并等待他们 return。当然,你不能在两个任务中派出同一个单位,也不能在同一个任务中派出两套单位。
玩家拥有的每个单位都存储在req.session(快速会话)中,所以在开始任务之前,我检查它们是否在使用中,如果是,则中止任务,如果空闲,标记它们在使用中并继续。
这就是问题所在,我不知道 req.session 是否共享,或者每条路线是否都有自己的副本,并且无法可靠地将它们标记为正在使用。
我试过信号量(npm 模块'locks'),但结果是一样的。
这里是(截取相关部分)日志:
E:\Documents\GIT\_>node app.js
2015/6/15 23:51:55:582 /start get
2015/6/15 23:51:55:582 /start parameters:
squad: 0,1
mission: 1
2015/6/15 23:51:55:612 start_miss squad locked
2015/6/15 23:51:55:613 start_miss Waiting
2015/6/15 23:51:56:73 /start parameters:
squad: 0,1
mission: 1
2015/6/15 23:51:56:75 start_miss squad locked
2015/6/15 23:51:56:76 start_miss Waiting
2015/6/15 23:51:56:625 end_missio End mission
2015/6/15 23:51:57:88 end_missio End mission
这是我的 "lock_squad" 代码:
function lock_unit(req, squad, callback, i) {
setImmediate(function () {
if(!i) {i = 0;}
log(log_level['DEBUG'], 'lock_unit', 'start ' + (i + 1) + ' / ' + squad.length);
if(i < squad.length) {
search_id(req.session.units, squad[i], function (id) {
req.session.units[id].deployed = true;
lock_unit(req, squad, callback, i + 1);
});
} else {
callback();
}
});
}
基本上,问题是:
如何锁定一个变量(存储在会话中的数组中的元素),以便在处理请求之前该对象不能被另一个或同一路由使用?
编辑:
似乎 req 是一个副本,所以我应该更改我的实现以给每个会话一个 id,并将该 id 用于 link 包含每个会话的每个单元的全局变量,并锁定它.这对我来说似乎是个坏主意,因为要么节点进程会占用大量内存,要么我需要手动创建一个 "garbage collector",每个陷阱都会产生。
有人有更好的主意吗?
在 res.end()
上快速保存会话,在我的例子中,这是在看到第二个请求后很长时间才发送的。
这意味着我仍然需要锁定会话(a la redis-lock,需要找到 mongoDB 等价物),并在开始计算战斗之前结束 res。