MST
星途 面试题库

面试题:Python多进程应用之高级难度:多进程资源竞争处理

在一个Python多进程项目中,多个进程需要同时访问和修改一个共享资源(比如一个文件)。请使用`multiprocessing`模块设计一个方案,避免资源竞争导致的数据不一致问题,同时要保证程序的高效运行。请描述设计思路并给出关键代码示例。
50.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 使用锁(Lock)机制:在multiprocessing模块中,Lock对象可以用来确保在同一时间只有一个进程能够访问共享资源。当一个进程获取到锁后,其他进程必须等待锁被释放才能访问共享资源,这样就能避免资源竞争。
  2. 文件操作封装:将对共享文件的操作封装在一个函数中,在函数内部获取锁,完成文件操作后再释放锁,确保文件操作的原子性。
  3. 高效运行考虑:为了保证高效运行,尽量减少锁的持有时间,即文件操作尽可能简洁高效,避免在持有锁的情况下进行大量无关计算。

关键代码示例

import multiprocessing


def write_to_file(lock, file_path, content):
    with lock:
        with open(file_path, 'a') as f:
            f.write(content + '\n')


if __name__ == '__main__':
    lock = multiprocessing.Lock()
    file_path ='shared_file.txt'
    processes = []
    contents = ['line1', 'line2', 'line3']
    for content in contents:
        p = multiprocessing.Process(target=write_to_file, args=(lock, file_path, content))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

在上述代码中:

  1. write_to_file函数接受锁对象、文件路径和要写入的内容作为参数。
  2. with lock语句获取锁,确保同一时间只有一个进程能进入with块进行文件写入操作。
  3. with open(file_path, 'a') as f以追加模式打开文件并写入内容。
  4. if __name__ == '__main__':块中,创建锁对象和进程列表,为每个要写入的内容创建一个进程并启动,最后等待所有进程执行完毕。