一、回顾
1、并发与并行:
并发:在同一个时间短内多个任务同时进行。
并行:在用一个时间点上多个任务同时进行。
2、进程的三大基本状态:
就绪状态:所有进程需要的资源都获取到了,除了CPU。
执行状态:获取到了所有资源包括CPU,进程处于运行状态。
阻塞状态:进程停止不再运行,放弃了CPU,进程此时处于内存中。
3、什么叫进程?
正在运行的程序;由代码段,数据段,PCB(进程控制块)组成;
进程是资源分配的基本单位;
4、进程之间能不能直接通信?
正常情况下,多进程之间是无法进行通信的。因为每一个进程都有自己独立的内存空间。
5、锁机制
为了多进程通信时,保护数据的安全性。
一把锁醅一把钥匙。
l = Lock( )
l.acquire( )
l.release( )
6、信号量
一把锁配多把钥匙。
sem = Semaphore(num)
num代表的是几把钥匙。
7、事件
e = Event( )
e.is_set( ) 返回一个bool值。
e.wait( ) 阻塞和非阻塞
e.set( ) 把is_set的bool值变为True
e.clear( ) 把is_set的bool变为False
二、生产者消费者模型
主要是为了解耦
借助队列来实现生产者消费者模型。
1、栈与队列介绍
栈:先进后出(First In Last Out 简称FILO)
队列:先进先出(First In First Out 简称FIFO),队列是安全的。
import queue # 不能进程多进程之前的数据传输(不用) from multiprocessing import Queue # 用这个模块
(1)队列的主要内容
q = Queue(num) # num:队列的最大长度 q.get() # 阻塞等待获取数据,如果有数据直接获取,如果没有数据,阻塞等待 q.put() # 阻塞,如果可以继续往队列中放数据,就直接放,不能放就阻塞等待 q.get_nowait() # 不阻塞,如果有数据直接获取,没有数据就报错 q.put_nowait() # 不阻塞,如果可以继续网队列中放数据,就直接放,不能就报错
(2)初始队列
1 # *******************练习**********************开始 2 from multiprocessing import Queue 3 4 q = Queue(3) # 长度为3 5 6 q.put(1) 7 q.put('abc') 8 q.put([4,5,6]) 9 print(123) 10 # q.put('娃哈哈') # 阻塞,不报错 11 try: 12 q.put_nowait('娃哈哈') # 阻塞,并报错 13 except: 14 print("队列满了") 15 print(111) 16 17 print(q.get()) 18 print(q.get()) 19 print(q.get()) 20 # print(q.get()) # 阻塞,等待 21 try: 22 print(q.get_nowait()) 23 except: 24 print("队列已经空了") 25 26 # *******************练习**********************结束
2、队列实现生产者消费模型
1 # *******************队列实现生产者消费者模型**********************开始 2 from multiprocessing import Queue,Process 3 import time 4 5 def consumer(q,name): 6 while 1: 7 info = q.get_nowait() 8 if info: 9 print('%s拿走了%s' % (name,info)) 10 else: 11 print("没有娃娃了,等下一批吧") 12 break 13 14 15 # 消费者如何判断,生产者是没来得及生产,还是生产者不在生产了? 16 17 def producer(q,product): 18 for i in range(20): 19 info = product+'娃娃%s号' % str(i) 20 q.put(info) 21 q.put(None) 22 23 if __name__ == '__main__': 24 q = Queue(10) 25 p_pro = Process(target=producer,args=(q,'mini版本')) 26 p_con = Process(target=consumer,args=(q,'xxx')) 27 p_pro.start() 28 p_con.start() 29 # *******************队列实现生产者消费者模型**********************结束
3、进阶生产者消费者模型
(1)进阶:将生产者生产结束的标识,放到父进程中。
1 # *******************进阶生产者消费者模型**********************开始 2 from multiprocessing import Queue,Process 3 import time 4 5 def consumer(q,name,color): 6 while 1: 7 info = q.get() 8 if info: 9 print('%s%s拿走了%s 33[0m' % (color,name,info)) 10 else: 11 print("没有娃娃了,等下一批吧") 12 break 13 14 # 消费者如何判断,生产者是没来得及生产,还是生产者不在生产了? 15 16 def producer(q,product): 17 for i in range(20): 18 info = product+'娃娃%s号' % str(i) 19 q.put(info) 20 21 if __name__ == '__main__': 22 q = Queue(10) 23 p_pro1 = Process(target=producer,args=(q,'mini版本')) 24 p_pro2 = Process(target=producer,args=(q,'maxi版本')) 25 p_pro3 = Process(target=producer,args=(q,'super版本')) 26 p_con1 = Process(target=consumer,args=(q,'夏明','