Python多进程编程时使用进程池可以使进程管理变得非常方便,但是当多个进程同时对共享资源进行访问时可能引起一些问题:
例如,多个进程对同一个文件进行写入,在一个进程的写入操作尚未结束时,就被CPU切换到另一个进程,这种情况会造成文件写入顺序和文件内容混乱。
正确的处理应该是,只有一个进程的写入操作结束时,另一个进程才可以开始写入。多进程锁可以解决上述问题,通过对文件写入操作的保护避免写入混乱。
代码示例
# -*- coding:utf-8 -*-
from multiprocessing import Pool
from multiprocessing import Manager
import random
def write_file(lock):
with lock:
with open('lock_demo.txt', 'a') as wf:
wf.write(str(random.random())+"\r")
if __name__ == '__main__':
lock = Manager().Lock()
pool = Pool()
for i in range(0, 10):
# pool.apply_async(write_file(lock))
pool.apply_async(write_file, args=(lock,))
pool.close()
pool.join()
write_file函数还可以写成:
def write_file(lock):
lock.acquire()
with open('lock_demo.txt', 'a') as wf:
wf.write(str(random.random())+"\r")
lock.release()
lock.acquire()和lock.release()之间的代码即为被锁保护的部分