锁 —— multiprocessing.Lock
通过刚刚的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序(或者说由操作系统调度决定他们的顺序),一旦开启也不受我们控制。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题。
当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。
加锁的形式确保了程序的顺序执行,但是执行又变成了串行,降低了效率,但是不得不说,它确保了数据的安全性。
l = Lock()
一把钥匙配一把锁
拿钥匙,锁门 l.acquire ( acquire: 获取 )
还钥匙,开门 l.release (release: 释放)
from multiprocessing import Lock l = Lock() l.acquire()# 拿走钥匙,锁门,不让其他人进屋 l.release()# 释放锁。 还钥匙,开门,允许其他人进屋
# -*- coding:utf-8 -*- # Author : Niuli # Data : 2018/8/21 下午3:59 from multiprocessing import Process, Lock, Value import time def get_money(num, l): l.acquire() # 拿走钥匙,锁门 for i in range(100): # 100块,每次取1块 num.value -= 1 print('取:', num.value) time.sleep(0.01) l.release() # 还钥匙,开门,下一位可以进入 def put_money(num, l): l.acquire() # 拿走钥匙,关上门 for i in range(101): # 100块,每次存1块 num.value += 1 print('存:', num.value) time.sleep(0.01) l.release() # 还钥匙.开门,下一位可以进入 if __name__ == '__main__': num = Value('i', 100) # 类似 struck 需要一个类型,一个数据 l = Lock() # 实例化Lock的对象l (需要先制造一把锁) p_get = Process(target=get_money, args=(num, l)) # 创建取钱的进程,传两个参数:钱数,锁 p_put = Process(target=put_money, args=(num, l)) # 创建存钱的进程,传两个参数:钱数,锁 p_get.start() # 开启取钱的进程 p_put.start() # 开启存钱的进程 # 没有join 会异步执行,主程序会先执行完,打印最终的钱数 会是最开始的钱数 # 没有join会先执行完主程序 # 有join,主程序会等着子程序执行完后再接着执行 p_get.join() # 异步转同步,让子进程先执行,主程序等着 p_put.join() # 异步转同步,让子进程先执行,主程序等着 print('这里是最终的钱数:', num.value)