一次只允许一个异步操作

Jas*_*n C 6 javascript node.js

我正在构建一个站点,一个特定的操作会触发一个长的服务器端进程来运行.此操作不能同时运行两次,因此我需要实现某种保护.它也不能同步,因为服务器在运行时需要继续响应其他请求.

为此,我构建了这个小概念测试,sleep 5用来替代我实际的长期运行过程(需要快速子进程承诺,在带有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);
Run Code Online (Sandbox Code Playgroud)

这样做的目的是当请求"/ test"时它触发一个长操作,如果在它运行时再次请求"/ test",它会回复"忙"并且什么都不做.

我的问题是,这种实施安全和正确吗?它似乎在我的粗略测试中起作用,但它很可疑.这是基本上实现互斥+ +"try-lock"操作的正确方法,还是有一些更合适的Node.js构造?从习惯于标准多线程实践的语言开始,我对Node的单线程但异步性质不太满意.

Chr*_*res 4

没问题 - Javascript 代码不能与 Node 中的其他 JS 代码同时运行。没有什么可以改变你身下忙碌的旗帜。不需要多线程样式的监视器或关键部分。