面试题答案
一键面试设计思路
- 使用锁(Lock)机制:在
multiprocessing
模块中,Lock
对象可以用来确保在同一时间只有一个进程能够访问共享资源。当一个进程获取到锁后,其他进程必须等待锁被释放才能访问共享资源,这样就能避免资源竞争。 - 文件操作封装:将对共享文件的操作封装在一个函数中,在函数内部获取锁,完成文件操作后再释放锁,确保文件操作的原子性。
- 高效运行考虑:为了保证高效运行,尽量减少锁的持有时间,即文件操作尽可能简洁高效,避免在持有锁的情况下进行大量无关计算。
关键代码示例
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()
在上述代码中:
write_to_file
函数接受锁对象、文件路径和要写入的内容作为参数。with lock
语句获取锁,确保同一时间只有一个进程能进入with
块进行文件写入操作。with open(file_path, 'a') as f
以追加模式打开文件并写入内容。- 在
if __name__ == '__main__':
块中,创建锁对象和进程列表,为每个要写入的内容创建一个进程并启动,最后等待所有进程执行完毕。