欢迎访问宙启技术站
智能推送

利用FileLock()实现Python中不同进程间对同一文件的数据共享与同步

发布时间:2024-01-02 08:33:22

在Python中,可以使用FileLock()实现不同进程间对同一文件的数据共享与同步。FileLock()是Python标准库中的一个模块,它提供了对文件的加锁功能,可以使不同进程在操作同一文件时能够互斥访问。

下面是一个使用FileLock()实现进程间数据共享与同步的示例代码:

import os
import time
from filelock import FileLock

# 定义一个函数,用于执行进程间对文件的读写操作
def operate_file(file_path):
    # 获取进程ID
    pid = os.getpid()
    
    # 创建FileLock对象,指定锁文件路径
    lock = FileLock(file_path+".lock")
    
    # 获取锁
    with lock:
        # 读取文件中的数据
        with open(file_path, "r") as file:
            data = file.read()
            print("进程{}读取到的数据为:{}".format(pid, data))
        
        # 追加写入数据到文件
        with open(file_path, "a") as file:
            time.sleep(2)  # 模拟操作耗时
            file.write("Hello from process {}
".format(pid))
            print("进程{}写入数据成功".format(pid))

# 主函数
if __name__ == "__main__":
    file_path = "data.txt"
    
    # 如果文件不存在,则创建文件并初始化数据
    if not os.path.exists(file_path):
        with open(file_path, "w") as file:
            file.write("Initial data
")
    
    # 创建多个子进程,同时对文件进行读写操作
    pid1 = os.fork()  # 子进程1
    if pid1 == 0:
        operate_file(file_path)
        os._exit(0)
    
    pid2 = os.fork()  # 子进程2
    if pid2 == 0:
        operate_file(file_path)
        os._exit(0)
    
    # 等待子进程执行完毕
    os.waitpid(pid1, 0)
    os.waitpid(pid2, 0)

上述代码中,首先导入了os和time模块以及filelock库的FileLock类。然后定义了一个operate_file函数,在该函数中,先获取进程ID,然后创建FileLock对象并指定锁文件路径。接着使用with语句获取锁,并在锁的保护下分别读取和追加写入文件的数据。最后,在主函数中先判断文件是否存在,如果不存在则创建文件并初始化数据。然后创建两个子进程,分别执行operate_file函数来对文件进行读写操作。最后等待子进程执行完毕。

这样,当多个进程并发访问同一个文件时,通过使用FileLock进行资源锁定,可以确保每个进程能够按顺序获得访问权,并且不会发生数据冲突和不一致的情况。

需要注意的是,以上代码只是一个简单示例。在实际应用中,还需要考虑文件读写的异常处理、锁定超时等情况,以保证程序的稳定性和健壮性。同时,FileLock()并不是跨平台的,它依赖于底层文件描述符的fcntl()功能,因此在不同操作系统上的行为可能会有所差异。如果需要进行跨平台的文件加锁操作,可以考虑使用更为强大和灵活的第三方库,例如fasteners或portalocker。