【问题标题】:javascript manage shared resource access for asynchronous functionsjavascript 管理异步函数的共享资源访问
【发布时间】:2021-05-01 11:08:47
【问题描述】:

我正在编写一个 node.js 服务器脚本,它为多个客户端异步使用共享文本列表数据。

客户端可以读取、添加或更新此共享列表的项目。

static getitems(){
    if (list== undefined) list = JSON.parse(fs.readFileSync("./list.json"));
    return list;
}

static additem(newitem){
    var key = Object.keys(newitem)[0];
    list[key] = newitem[key];
    fs.writeFileSync("./list.json", JSON.stringify(list));
}

客户端可以使用以下快速 API 修改和获取列表数据

app.get("/getlist"), (req, res)=>{
    res.send(TempMan.getTemplates());
});

app.post("/addlist"), (req, res)=>{
    additem(req.body.newitem)
    res.status(204).end()
});

拥有 C#、C++ 和其他桌面编程语言的长期背景,虽然我红色的 javascript 没有遇到竞争条件,但我很担心资源共享会成为问题。我首先想到的是其他语言的信号量或共享锁或其他一些多线程管理解决方案,但是阅读 javascript 不需要这些方法。

这样的 node.js 实现是否会遇到资源共享问题,例如同时尝试文件读/写?我该如何解决这个问题?我需要某种可以在 javascript 中使用的事务函数吗?

【问题讨论】:

    标签: javascript node.js express asynchronous race-condition


    【解决方案1】:

    一般来说,一个Node.js程序可能遇到你所说的资源共享问题,通常我们称之为“race condition”问题。这不是由于两个线程/进程,而是由于内在属性:async。假设有两个异步函数,第一个已经启动但还没有结束,里面有一些await,在这种情况下,第二个异步函数可以启动。如果他们访问代码块中的相同资源,可能会导致竞争条件。

    我制作了一张幻灯片来介绍这个问题:https://slides.com/grimmer/intro_js_ts_task_queuelib_d4c/fullscreen#/0/12

    回到您的示例代码,您的代码不会有任何竞争条件。即使你在 express 路由回调中而不是 fs.writeFileSync 中使用了异步函数,原因是 Express 的实现将等待第一个异步路由回调处理函数,并且仅在第一个异步路由回调处理函数之后开始执行第二个异步路由回调处理函数一个完成了。

    例如:

    app.post('/testing1', async (req, res) => {
      // Do something here
    });
    
        
    app.post('/testing2', async (req, res) => {
      // Do something here
    });
    

    就像下面的代码在Express的实现中,

    async function expressCore() {
      await 1st_routing_call_back()
      await 2nd_routing_call_back()     
    }
    
    

    但请记住,其他服务器框架可能没有相同的行为。 https://www.apollographql.com/https://nestjs.com/ 都允许同时执行两个异步路由方法。如下所示

    async function otherServerFrameworkCore() {
      1st_routing_call_back()
      2nd_routing_call_back()     
    }
    

    如果这是您关心的问题,您需要找到一种避免竞争条件的方法。将事务用于 DB 使用或一些轻量级且适用于单个 Node.js 实例程序的 npm 同步库,例如https://www.npmjs.com/package/d4c-queue 这是我制作的。多 Node.js 实例是多进程,应该有可能的竞争条件问题,DB 事务是更合适的解决方案。

    【讨论】:

      猜你喜欢
      • 2021-02-05
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2023-03-10
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      相关资源
      最近更新 更多