一、回顾
1、一些名词回顾:
并行:两个进程在同一时间点发生
并发:两个进程在同一时间间隔内运行
同步:某一个任务的执行必须依赖于另一个任务的返回结果
异步:某一个任务的执行,不需要依赖于另一个任务的返回,只需要告诉另一个任务一声
阻塞:程序因为类似IO等待,等待事件导致无法继续执行
非阻塞:程序遇到类似IO操作时,不再阻塞等待,如果没有及时的处理IO,就报错或者跳过等替他操作
2、进程的方法和属性:
(1)方法:
start( ) 开启一个进程
join( ) 异步变同步,让父进程等待子进程的结束,再继续执行
is_alive( ) 判断进程是否活着
terminate 杀死进程
(2)属性:
name 子进程的名称
pid 子进程的pid
daemon 设置进程为守护进程,给一个True代表为守护进程,默认为False
3、守护进程:
(1)特点:
随着父进程的结束而结束
守护进程不能创建子进程
守护进程必须要在start之前设置
(2)代码:
1 from multiprocessing import Process 2 3 import time 4 5 def func1(): 6 for i in range(65,90): 7 print(chr(i)) 8 time.sleep(0.5) 9 10 def func(): 11 for i in range(10): 12 print(i) 13 time.sleep(0.5) 14 15 if __name__ == '__main__': 16 p = Process(target=func) 17 p.start() 18 p1 = Process(target=func1) 19 p1.daemon = True 20 p1.start() 21 # time.sleep(2) 22 23 # print(p.is_alive()) 24 # p.terminate() 25 # p.join() 26 # print(p.is_alive()) 27 # print(p.pid,p.name) 28 # for i in range(10,21): 29 # print(i) 30 # time.sleep(1)
二、锁机制
1、问题的产生?
数据共享使用时可能会出现混乱,比如以下代码实现的数据共享就会出现这样的情况。
1 # *******************问题**********************开始 2 from multiprocessing import Process,Value 3 import time 4 5 def get_money(num): # 取钱 6 for i in range(100): 7 num.value -= 1 8 time.sleep(0.01) 9 10 def put_money(num): # 存钱 11 for i in range(100): 12 num.value += 1 13 time.sleep(0.01) 14 15 if __name__ == '__main__': 16 num = Value('i',100) # 数据类型+值(数据共享) 17 p = Process(target=get_money,args=(num,)) 18 p.start() 19 p1 = Process(target=put_money,args=(num,)) 20 p1.start() 21 p.join() 22 p1.join() 23 print(num.value) # 获取到子进程的num 24 # *******************问题**********************结束
2、解决问题——锁机制
(1)锁涉及两个操作:
拿钥匙,锁门:——不让别人进屋
换钥匙,开门:——让别人进屋
(2)锁的特点是:一把钥匙配一把锁
(3)锁的相关代码:
1 from multiprocessing import Lock 2 3 l = Lock() 4 5 l.acquire() # 拿走钥匙,锁门,不让其他人进屋 6 7 l.release() # 释放锁,还钥匙,开门,允许其他人进入
(4)用锁解决问题对应的代码
1 from multiprocessing import Process,Value,Lock 2 import time 3 4 def get_money(num,l): # 取钱 5 l.acquire() # 拿走钥匙,锁上门,不让其他人进来 6 for i in range(100): 7 num.value -= 1 8 time.sleep(0.01) 9 l.release() # 还钥匙,开门,允许其他人进入 10 11 def put_money(num,l): # 存钱 12 l.acquire() # 拿走钥匙,锁上门,不让其他人进来 13 for i in range(100): 14 num.value += 1 15 time.sleep(0.01) 16 l.release() # 还钥匙,开门,允许其他人进入 17 18 if __name__ == '__main__': 19 l = Lock() # 设置一把锁 20 num = Value('i',100) # 数据类型+值(数据共享) 21 p = Process(target=get_money,args=(num,l)) 22 p.start() 23 p1 = Process(target=put_money,args=(num,l)) 24 p1.start() 25 p.join() 26 p1.join() 27 print(num.value) # 获取到子进程的num
(5)模拟抢票
1 # *******************抢票**********************开始 2 from multiprocessing import Process,Lock 3 import time 4 5 6 def check(i): 7 with open("余票") as f: 8 con = f.read() 9 print("第%s个人查到余票还剩%s张" % (i,con)) 10 11 def buy_ticket(i,l): 12 # 这里的锁是保护在多进程中数据安全 13 l.acquire() 14 with open("余票") as f: 15 con = int(f.read()) 16 time.sleep(0.1) 17 18 if con > 0: 19 print('