跳到主要内容
版本:0.3.x

同步于文件之间

文件同步基于包fasteners。在此情况下,透过共享的日志(log)文件来是实现缓存,并通过文件锁实现同步。当用户需要在同一设备的不同程序之间进行信息同步,则建议使用LineFileBuffer

下例提供了两个脚本(writer.pyreader.py)。读者(reader)需要在写者(writer)之前启动。接下来,所有来自writer的信息都会被reader捕获。

writer.py
import os
import time
from contextlib import redirect_stdout, redirect_stderr
import syncstream

os.makedirs('logs', exist_ok=True) # 创建日志文件夹。
buffer = syncstream.LineFileBuffer('logs/message', maxlen=10, tmp_id=os.getpid())
with redirect_stdout(buffer), redirect_stderr(buffer):
for i in range(10):
time.sleep(1.0)
print('Line', 'buffer', 'new', i, end='\n')
buffer.new_line() # 终结信号。

在上例中,writer和reader是作为两个不同的python程序启动的。无论是reader还是writer,均不知道对方运行的细节。唯一实现同步的、就是透过文件共享的信息。文件锁确保了不同的程序不会引发同步故障。

在writer和reader中,使用了同样的实例LineFileBuffer。不同于LineBuffer以及LineProcBuffer,读者需要反复调用buffer.read()方法。每次调用该方法时,存在于文件中的记录就会被遍历一次。读者会持续在每秒扫描文件,直到收集到10行记录。

危险

唯一不安全的因素,是程序的突然中断。这会导致、程序退出时,部分锁文件仍然保留了下来。要避免旧的锁文件干扰程序,建议在运行reader之前,移除所有的锁文件。