锁 —— 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)
取: 99 取: 98 取: 97 取: 96 取: 95 取: 94 取: 93 取: 92 取: 91 取: 90 取: 89 取: 88 取: 87 取: 86 取: 85 取: 84 取: 83 取: 82 取: 81 取: 80 取: 79 取: 78 取: 77 取: 76 取: 75 取: 74 取: 73 取: 72 取: 71 取: 70 取: 69 取: 68 取: 67 取: 66 取: 65 取: 64 取: 63 取: 62 取: 61 取: 60 取: 59 取: 58 取: 57 取: 56 取: 55 取: 54 取: 53 取: 52 取: 51 取: 50 取: 49 取: 48 取: 47 取: 46 取: 45 取: 44 取: 43 取: 42 取: 41 取: 40 取: 39 取: 38 取: 37 取: 36 取: 35 取: 34 取: 33 取: 32 取: 31 取: 30 取: 29 取: 28 取: 27 取: 26 取: 25 取: 24 取: 23 取: 22 取: 21 取: 20 取: 19 取: 18 取: 17 取: 16 取: 15 取: 14 取: 13 取: 12 取: 11 取: 10 取: 9 取: 8 取: 7 取: 6 取: 5 取: 4 取: 3 取: 2 取: 1 取: 0 存: 1 存: 2 存: 3 存: 4 存: 5 存: 6 存: 7 存: 8 存: 9 存: 10 存: 11 存: 12 存: 13 存: 14 存: 15 存: 16 存: 17 存: 18 存: 19 存: 20 存: 21 存: 22 存: 23 存: 24 存: 25 存: 26 存: 27 存: 28 存: 29 存: 30 存: 31 存: 32 存: 33 存: 34 存: 35 存: 36 存: 37 存: 38 存: 39 存: 40 存: 41 存: 42 存: 43 存: 44 存: 45 存: 46 存: 47 存: 48 存: 49 存: 50 存: 51 存: 52 存: 53 存: 54 存: 55 存: 56 存: 57 存: 58 存: 59 存: 60 存: 61 存: 62 存: 63 存: 64 存: 65 存: 66 存: 67 存: 68 存: 69 存: 70 存: 71 存: 72 存: 73 存: 74 存: 75 存: 76 存: 77 存: 78 存: 79 存: 80 存: 81 存: 82 存: 83 存: 84 存: 85 存: 86 存: 87 存: 88 存: 89 存: 90 存: 91 存: 92 存: 93 存: 94 存: 95 存: 96 存: 97 存: 98 存: 99 存: 100 存: 101 这里是最终的钱数: 101
from multiprocessing import Process, Lock import time def check(i): # 查看不需要上锁 with open('余票') as f: content = f.read() print('第%s个人查到余票还剩%s张' % (i, content)) def buy(i, l): l.acquire() # 拿钥匙,锁门 with open('余票') as f: content = int(f.read()) if content > 0: print('