我正在构建一个站点,一个特定的操作会触发一个长的服务器端进程来运行。此操作不能同时运行两次,因此我需要实现某种保护。它也不能同步,因为服务器在运行时需要继续响应其他请求。
为此,我构建了这个小概念测试,使用sleep 5
代替我实际的长期运行过程(需要 express 和 child-process-promise ,在具有sleep
命令的系统上运行,但替代Windows的任何内容:
var site = require("express")();
var exec = require("child-process-promise").exec;
var busy = false;
site.get("/test", function (req, res) {
if (busy) {
res.json({status:"busy"});
} else {
busy = true; // <-- set busy before we start
exec("sleep 5").then(function () {
res.json({status:"ok"});
}).catch(function (err) {
res.json({status:err.message});
}).then(function () {
busy = false; // <-- finally: clear busy
});
}
});
site.listen(8082);
这意味着当请求“/ test”时它会触发一个长时间的操作,并且如果在它运行时再次请求“/ test”,它会回复“忙碌”并且什么都不做。
我的问题是,这种实施是否安全和正确?它似乎在我的粗略测试中起作用,但它很可疑。这是基本上实现互斥+ +“try-lock”操作的正确方法,还是有一些更合适的Node.js构造?从我习惯的语言到标准的多线程实践,我对
答案 0 :(得分:3)
你很好--Javascript代码无法与Node中的其他JS代码同时运行。什么都不会改变你下面的忙碌旗帜。无需多线程样式的监视器或关键部分。