当我的服务器收到请求时,我运行函数foo。在foo期间的某个时候,我检查机器上是否存在一些文件(基于请求),并远程获取那些不存在的文件,将它们保存在本地,以便在将来的请求中使用。
如果同时接收多个请求,同时引用服务器上不存在的相同文件bar,则会遇到问题。下面是发生情况的一个示例时间线:
异步检查bar
bar
bar不存在,因此异步下载文件
bar的流,并异步将文件响应导入到该写stream
bar,并异步地将文件响应传送到写入stream
这是因为文件内容无效,因为文件正在被请求2覆盖。
我知道解决这个问题可能涉及文件锁定,所以第一个看到文件在本地丢失的请求可以创建一个锁文件,以向后续请求指示它已经被抓取/写入。我不确定的是如何使这些后续请求等待文件加载完成。
如果看到其他请求正在获取这个远程文件,我应该使用生成器函数并暂停函数的执行吗?在这种情况下,我以后怎么继续呢?是否必须维护暂停请求的全局队列?
有没有什么资源可以帮助我更好地理解这里该做什么呢?
发布于 2020-06-09 21:28:03
您将需要某种形式的同步。只要您只运行一个NodeJS进程,最简单的方法就是使用JavaScripts单线程行为:
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);
}https://stackoverflow.com/questions/62292028
复制相似问题