在nodejs中,如何限制同时访问一部分代码的数量



我代码的一部分,我希望它同时运行,没有并行运行。

我找到了信号:

var sem = require('semaphore')(1);
sem.take(function(){
//xxxxxxxx
sem.leave()
})

如果我这样做,似乎SEM.Take和Sem.leave之间的代码只会同时执行。但是还有其他方法吗?因为作为节点用户,我不太高兴触摸这种"多线程"的东西。

我的问题是以下代码,我希望它们仅同时运行一次。但是此功能最多可能需要10秒,因为我正在等待run_cmd的响应(基本上是包裹的child.exec(。但是,如果我刷新了页面。两个过程将沿着silmutaneane的速度运行。并且上一个过程中的Stdout可能会影响到即将到来的过程。

如何解决这个问题?

on.connnection(){
    async function(){
        let res = await run_cmd('xxxx')
        res = parse_first_res(res)
        res = await run_cmd('zzz' + res)
        res = parse_second_res('xxyy' + res)
        ....
    }
}

nodejs本质上是单线螺纹。因此,只要代码是同步的,就不会发生任何并行处理,因此您是安全的。

但是,如果代码不是同步(例如,进行一些数据库调用(,则需要某种锁定/信号量。没有逃脱。

还要注意,锁/信号量保证仅调用函数一次。它只保证不会发生并行处理。为了确保仅在需要一些其他标志和if语句。

时才调用该函数。

原因是作为节点用户,我不太高兴触摸这种"多线程"的东西。

这与多或单线螺纹无关。这是关于并行处理。无论您是否是节点用户,都没关系。您将必须在某个时候处理比赛条件。

最新更新