一次只允许一个asynchronous操作

我build立一个网站,一个特定的操作触发一个长的服务器端进程运行。 这个操作不能同时运行两次,所以我需要实现某种保护。 它也不能同步,因为服务器运行时需要继续响应其他请求。

为此,我构造了这个小概念testing,使用sleep 5代替了我的实际的长时间运行的进程(需要expresschild-process-promise ,运行在带有sleep命令的系统上,但是replace为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”,它会以“忙”的方式回复,而什么也不做。

我的问题是,这个实现是否安全和正确? 它似乎在我的粗略testing工作,但它是可疑的简单。 这是从本质上实现互斥锁+“try-lock”操作的正确方法,还是有一些更合适的Node.js构造? 从习惯于标准multithreading实践的语言来看,我还不太了解Node的单线程但是asynchronous的特性。

你很好 – Javascript代码不能与Node中的其他JS代码同时运行。 没有什么会改变你下面的繁忙旗帜。 不需要multithreading风格的显示器或关键部分。