课程回顾:
并行 : 两个进程在同一时间点发生
并发 : 两个进程在同一时间间隔内运行
同步 : 某一个任务的执行必须依赖于另一个任务的返回结果
异步 : 某一个任务的执行,不需要依赖于另一个任务的返回,只需要告诉另一个任务一声
阻塞 : 程序因为类似于IO等待、等待事件等导致无法继续执行。
非阻塞:程序遇到类似于IO操作时,不再阻塞等待,如果没有及时的处理IO,就报错或者跳过等其他操作
进程的方法和属性:
方法:start() 开启一个子进程
join 异步变同步,让父进程等待子进程的执行结束,再继续执行
is_alive, 判断进程是否活着
terminate 杀死进程
属性:
name 子进程的名字
pid 子进程的pid
daemon 设置进程为守护进程,给一个True代表为守护进程,默认为False,不是守护进程
守护进程
特点:
随着父进程的代码执行完毕才结束
守护进程不能创建子进程
守护进程必须要在start之前设置
复习下代码
主程序与子程序是异步的关系
但是家上p.join()就同步了,主程序会等着子程序执行完
from multiprocessing import Process import time def func(): for i in range(10): print(i) time.sleep(0.5) if __name__ == '__main__': p = Process(target=func) p.start() for i in range(10,21): print(i) time.sleep(1) ===============主程序、子程序交替打印 10 0 1 11 2 3 12 4 5 13 6 7 14 8 9 15 16 17 18 19 20
from multiprocessing import Process import time def func(): for i in range(10): print(i) time.sleep(0.5) if __name__ == '__main__': p = Process(target=func) p.start() p.join() # 加上这行,就变成同步的了 for i in range(10,21): print(i) time.sleep(1) ==============先让子程序执行完、主程序才继续执行 1-20
守护进程 随着主进程结束而结束
from multiprocessing import Process import time def func1(): for i in range(65,90): print(chr(i)) time.sleep(0.5) def func(): for i in range(10): print(i) time.sleep(0.5) if __name__ == '__main__': p = Process(target=func) p.start() p1 = Process(target=func1) p1.daemon = True p1.start() =================== 0-9
为什么上面的程序不打印func1()呢?
因为主进程已经执行完了!所以func1做为主程序的守护进程来不及执行就结束了
我们在主进程运行的时间多一点即可
from multiprocessing import Process import time def func1(): for i in range(65,90): print(chr(i)) time.sleep(0.5) def func(): for i in range(10): print(i) time.sleep(0.5) if __name__ == '__main__': p = Process(target=func) p.start() p1 = Process(target=func1) p1.daemon = True p1.start() time.sleep(2) ====== func1会打印2秒的值
IPC -- inter process Communication 进程间通信
提出问题:
主进程和子进程的值共享吗?
from multiprocessing import Process,Value,Lock import time def get_money(num): num -= 1 def put_money(): pass if __name__ == '__main__': num =100 p = Process(target=get_money,args=(num,)) p.start() p.join() print(num) # 100 不共享
引入第三方模块Value
from multiprocessing import Process,Value import time def get_money(num): # 传入对象 num.value -= 1 print('子进程', num.value) def put_money(): pass if __name__ == '__main__': num = Value('i',50) # 实例化值,给一个数和类型 p = Process(target=get_money,args=(num,)) p.start() p.join() print(num.value)
value的不好的案例
from multiprocessing import Process,Value,Lock import time def get_money(num): for i in range(100): num.value -= 1 time.sleep(0.01) def put_money(num): for i in range(100): num.value +=1 time.sleep(0.01) if __name__ == '__main__': num = Value('i',100) p1 = Process(target=get_money,args=(num,)) p1.start() p2 = Process(target=put_money, args=(num,)) p2.start() p1.join() p2.join() print(num.value) # 发现打印出来的值并不是100 而是在100左右摆动
出现问题了,变量在赋值的时候混乱
这时候,我们引入锁的机制
from multiprocessing import Lock l = Lock() l.acquire()# 拿走钥匙,锁门,不让其他人进屋 l.release()# 释放锁。 还钥匙,开门,允许其他人进屋
from multiprocessing import Process,Value,Lock import time def get_money(num,l):# 取钱 l.acquire()# 拿走钥匙,锁上门,不允许其他人进屋 for i in range(100): num.value -= 1 print(num.value) time.sleep(0.01) l.release()# 还钥匙,打开门,允许其他人进屋 def put_money(num,l):# 存钱 l.acquire() for i in range(100): num.value += 1 print(num.value) time.sleep(0.01) l.release() if __name__ == '__main__': num = Value('i',100) l = Lock() p = Process(target=get_money,args=(num,l)) p.start() p1 = Process(target=put_money, args=(num,l)) p1.start() p.join() p1.join() print(num.value)
from multiprocessing import Process,Lock import time def check(i): with open('余票') as f: con = f.read() print('第%s个人查到余票还剩%s张'%(i,con)) def buy_ticket(i,l): l.acquire()# 拿钥匙,锁门 with open('余票') as f: con = int(f.read()) time.sleep(0.1) if con > 0: print('