我有节点服务。节点服务有一个内存缓存,它是内存中的键值存储。节点服务还每天运行周期性任务,这是重建缓存(CPU密集型和花费大量时间)。当重建缓存任务正在运行时,它会阻止其他/get请求吗?这里有比赛条件吗?
/get: get the cache data by key
setInterval(()=>{ rebuildCache() ; }, 3600)
async rebuildCache(filepath: string, key: string): Promise<void> {
const obj = constructFromFile(filepath)
//load json from filepath. do some cpu intensitive work. (build schema, reference, etc)
cache[key] = obj
}
发布于 2019-12-27 02:15:18
会阻止其他/get请求吗?
这取决于rebuildCache()
做什么以及它是如何工作的。如果它是一个同步操作(完全是CPU),那么这将阻止事件循环并阻止所有请求处理。
这里有比赛条件吗?
这取决于使用缓存的代码是如何编写的,以及rebuildCache()
做了什么。如果使用缓存的任何操作都是异步的,并且它们依赖于缓存的一致性,从它运行异步操作之前到完成异步操作之后,那么rebuildCache()
可以在该时间窗口中发生,并且您确实有一个争用条件。
问题在于使用缓存和重新构建缓存的函数来实现代码的实际实现,因此我们只能提供假设的答案,而不能看到实际的代码。
FYI,你问题中的这个代码:
setInterval(rebuildCache())
只给rebuildCache()
打过一次电话。要在任何时间间隔内调用它,您需要如下所示:
setInterval(rebuildCache, t);
注意,您传递一个函数引用(没有父函数),并为计时器间隔传递一个时间。
https://stackoverflow.com/questions/59498417
复制相似问题