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

Python中使用FileLock()实现进程并发地写一个文件

发布时间:2024-01-02 08:32:59

在Python中,可以使用FileLock模块来实现进程并发地写一个文件。FileLock是一个简单的锁定文件的实用程序,它可以确保同一时间只有一个进程可以访问某个文件。

下面是一个使用FileLock实现并发写文件的示例:

import os
import time
from filelock import FileLock

# 定义一个函数,用于并发地写文件
def write_file(filename, data):
    # 使用with语句来获取文件锁
    with FileLock(filename + '.lock'):
        # 打开文件,以追加模式写入数据
        with open(filename, 'a') as f:
            # 模拟写入数据的耗时操作
            time.sleep(1)
            # 写入数据
            f.write(data + '
')

# 创建多个进程并发地写文件
if __name__ == '__main__':
    # 文件名
    filename = 'data.txt'
    # 写入次数
    num_writes = 100

    # 创建一个data文件,如果已存在则删除
    if os.path.exists(filename):
        os.remove(filename)

    # 创建多个并发进程,每个进程写入数据
    for i in range(num_writes):
        # 进程编号
        process_id = i + 1
        # 数据
        data = f'Process {process_id}, data {i+1}'
        # 创建进程
        pid = os.fork()
        if pid == 0:
            # 子进程写入文件
            write_file(filename, data)
            os._exit(0)
    
    # 等待所有进程写入完毕
    for i in range(num_writes):
        # 等待子进程退出
        os.wait()

    # 输出文件内容
    with open(filename, 'r') as f:
        for line in f:
            print(line.strip())

在上面的示例中,我们首先导入了FileLock模块。然后,我们定义了一个write_file函数,用于并发地写入文件。在函数内部,我们使用with FileLock(filename + '.lock')语句来获取文件锁,确保同一时间只有一个进程可以访问文件。然后,我们打开文件以追加模式写入数据。为了模拟写入数据的耗时操作,我们使用time.sleep(1)来让进程暂停1秒钟。最后,我们使用f.write()方法将数据写入文件。

在主程序中,我们创建了多个并发进程,并通过调用write_file函数来并发地写入文件。我们使用os.fork()创建子进程,并在子进程中调用write_file函数。每个子进程写入不同的数据。调用os._exit(0)来终止子进程。在主程序中,我们使用os.wait()等待所有子进程退出。

最后,我们使用open函数打开文件,并逐行输出文件内容。

总结:

FileLock模块提供了一种简单而有效的方法来控制进程对文件的并发访问。通过在写文件之前获取文件锁,可以确保同一时间只有一个进程可以访问文件。