Python/Systemd - 如何从多个脚本编辑同一文件

问题描述 投票:0回答:1

我有 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)
python systemd
1个回答
0
投票

这都不是其中任何一个的问题。如果每个脚本都可以同时编辑该文件,那么该文件就会损坏,因为字节会被其他文件切断。

如果您真的想从多个位置写入同一个文件,有几种流行的方法可以做到这一点,但每种方法都有自己的问题:

1.创建多个文件并将它们组合在一起:

这是最简单的方法(在我看来),但在此过程中也需要大量的 RAM/磁盘。您可以为每个脚本创建一个单独的文件(例如

cache.json
cache1.json
等),而不是写入
cacheA.json
。所有脚本运行完毕后,创建一个编写器文件,读取每个 json 文件,将它们组合起来,然后将输出写入
cache.json

2.作者和工人脚本

这个有点复杂,但您实际上可以接收脚本的输出(在脚本结束后)。通过使用此方法,您将拥有 1 个持续工作的编写器类,并且每当脚本完成时,它都会获取输出并将其放入

cache.json

3.等待

如果你愿意放弃速度,你实际上可以告诉脚本等待,直到可以写入,一旦可以写入,他们就可以像平常一样写入并继续

© www.soinside.com 2019 - 2024. All rights reserved.