我有 12 个脚本,每分钟使用 systemd 运行一次,每五秒运行一次。我需要添加某种缓存文件,以便当前运行的脚本不会请求与运行之前的脚本相同的数据。但我需要当前脚本运行并保存其数据,即使之前的脚本尚未完成。
我在每个文件中使用以下代码来检查不运行当前脚本的 id。如果没有此代码,该脚本可以正常工作,但是当我添加它时,id 会被困在缓存中,并且无论添加哪个脚本都不会运行其查询。我不明白它们是如何进入缓存的,但脚本没有完成?
这是系统问题还是文件编辑问题?
list
是需要脚本处理的id列表。
cache
是一个带有带时间戳的 id 字典的文件。每个
收集 ids 列表,从缓存中已存在的列表中删除 ids,并将 ids 添加到脚本将处理的缓存中。 trim_cache
删除缓存中超过两分钟的任何 ID。
# sample cache
{"id1": 1707588242, "id2": 1707588242, "id3": 1707588242}
with open("cache.json") as f:
cache = json.load(f)
for item in list:
id = item[0]
if id in cache:
print '{} in cache'.format(id)
if id not in cache:
print '{} NOT in cache'.format(id)
cache[id] = int(time.time()) #add id to cache with timestamp
new_ids.append((id)) #add id to list for processing
#remove ids older than two minutes from cache
trim_cache = dict((k, v) for k, v in cache.items() if v > (int(time.time()) - 120))
with open('cache.json', 'wb') as f:
json.dump(cache, f)
这都不是其中任何一个的问题。如果每个脚本都可以同时编辑该文件,那么该文件就会损坏,因为字节会被其他文件切断。
如果您真的想从多个位置写入同一个文件,有几种流行的方法可以做到这一点,但每种方法都有自己的问题:
这是最简单的方法(在我看来),但在此过程中也需要大量的 RAM/磁盘。您可以为每个脚本创建一个单独的文件(例如
cache.json
、cache1.json
等),而不是写入 cacheA.json
。所有脚本运行完毕后,创建一个编写器文件,读取每个 json 文件,将它们组合起来,然后将输出写入 cache.json
。
这个有点复杂,但您实际上可以接收脚本的输出(在脚本结束后)。通过使用此方法,您将拥有 1 个持续工作的编写器类,并且每当脚本完成时,它都会获取输出并将其放入
cache.json
如果你愿意放弃速度,你实际上可以告诉脚本等待,直到可以写入,一旦可以写入,他们就可以像平常一样写入并继续