首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止在写入文件时访问该文件,并在写入文件后恢复执行?

如何防止在写入文件时访问该文件,并在写入文件后恢复执行?
EN

Stack Overflow用户
提问于 2020-06-09 21:18:34
回答 1查看 189关注 0票数 1

当我的服务器收到请求时,我运行函数foo。在foo期间的某个时候,我检查机器上是否存在一些文件(基于请求),并远程获取那些不存在的文件,将它们保存在本地,以便在将来的请求中使用。

如果同时接收多个请求,同时引用服务器上不存在的相同文件bar,则会遇到问题。下面是发生情况的一个示例时间线:

异步检查bar

  • Request 2是否存在bar

  • Request 2异步检查stream

  • Request 1是否存在,因此异步下载文件

  • 请求2查看bar不存在,因此异步下载文件

  • Request 1打开写bar的流,并异步将文件响应导入到该写stream

  • Request 2中,打开一个写入流到bar,并异步地将文件响应传送到写入stream

  • Request 1中,完成写入文件,尝试使用图像加载库加载其内容(图像),并最终引发错误。

这是因为文件内容无效,因为文件正在被请求2覆盖。

我知道解决这个问题可能涉及文件锁定,所以第一个看到文件在本地丢失的请求可以创建一个锁文件,以向后续请求指示它已经被抓取/写入。我不确定的是如何使这些后续请求等待文件加载完成。

如果看到其他请求正在获取这个远程文件,我应该使用生成器函数并暂停函数的执行吗?在这种情况下,我以后怎么继续呢?是否必须维护暂停请求的全局队列?

有没有什么资源可以帮助我更好地理解这里该做什么呢?

EN

回答 1

Stack Overflow用户

发布于 2020-06-09 21:28:03

您将需要某种形式的同步。只要您只运行一个NodeJS进程,最简单的方法就是使用JavaScripts单线程行为:

代码语言:javascript
复制
  const fileLoading = new Map();

  async function getFile(id) {
    if(fileLoading.has(id)) {
      await fileLoading.get(id);
    } else {
     const load = (async function() {
        await fetchFile(id);
        fileLoading.remove(id);
     })();
     fileLoading.set(id, load);
     await load;
   }
   return await readFile(id);
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62292028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档