5.1.7 互斥锁
互斥锁:并发串行,是对代码的局部做串型。是共享数据修改的那块代码变成串型。
join: join也是并发串行的。但是join是全局的串型。
互斥锁:牺牲效率保证数据的安全。
队列:效率+数据安全,详见队列一文
进程之间内存是独立的,但其他资源是共享的,如可以操作同一个文件。
没有互斥锁的情况下,以下执行结果:
from multiprocessing import Process import time def task(name): print('%s 1' %name) time.sleep(1) print('%s 2' %name) time.sleep(1) print('%s 3' %name) if __name__ == '__main__': for i in range(3): p=Process(target=task,args=('进程%s' %i,)) p.start()
输出:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
进程0 1 进程1 1 进程2 1 进程0 2 进程1 2 进程2 2 进程0 3 进程1 3 进程2 3
加互斥锁:
from multiprocessing import Process from multiprocessing import Lock # 要导入Lock import time def task(name, multi_lock): multi_lock.acquire() # 获得锁 print('%s 1' %name) time.sleep(1) print('%s 2' %name) time.sleep(1) print('%s 3' %name) multi_lock.release() #释放锁 if __name__ == '__main__': multi_lock = Lock() # 子进程会拷贝相同的内存,就会变成独立的锁,所以应该作为参数传给子进程 for i in range(3): p = Process(target=task, args=('进程%s' % i, multi_lock)) p.start()
# 互斥锁牺牲效率来保证数据不错乱
输出:
进程0 1
进程0 2
进程0 3
进程1 1
进程1 2
进程1 3
进程2 1
进程2 2
进程2 3