一次只允许一个异步操作

时间:2016-12-12 19:39:39

标签: javascript node.js

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

为此,我构建了这个小概念测试,使用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构造?从我习惯的语言到标准的多线程实践,我对单线程但异步的本性并不感到满意。

1 个答案:

答案 0 :(得分:3)

你很好--Javascript代码无法与Node中的其他JS代码同时运行。什么都不会改变你下面的忙碌旗帜。无需多线程样式的监视器或关键部分。