我有两个独立的cron服务,它们都触发了相同的python脚本。我只想执行其中一个调用,而另一个应该退出。有什么方法可以实现这个行为吗?基于进程开始时间创建一个锁文件(忽略时间戳中的秒数部分,这样时间对于这两个进程都是唯一的),并使用此名称访问一个文件。但这种特殊的方法会带来一些原子性问题。
sc4hvdpw1#
锁定文件应该是正确的解决方案,因为仅在文件不存在的情况下通过触摸创建文件是原子性的:
from pathlib import Path def create_lockfile(filename): try: Path(filename).touch(exist_ok=False) return True except FileExistsError: return False
在touch的源代码中,您会发现创建的文件带有O_EXCL标志,这意味着该文件仅在尚不存在时才会创建。在解决了原子问题之后,您只需要确保所有进程都尝试创建同一个(!)文件,这样您就可以实际使用该文件作为锁。
touch
O_EXCL
1条答案
按热度按时间sc4hvdpw1#
锁定文件应该是正确的解决方案,因为仅在文件不存在的情况下通过触摸创建文件是原子性的:
在
touch
的源代码中,您会发现创建的文件带有O_EXCL
标志,这意味着该文件仅在尚不存在时才会创建。在解决了原子问题之后,您只需要确保所有进程都尝试创建同一个(!)文件,这样您就可以实际使用该文件作为锁。