进程部分: 1. 进程间通信=>IPC 2. 生产者消费者模型(*****) 线程部分: 1. 线程理论(*****) 2. 开启线程的两种方式(*****) 3. 线程对象其他相关的属性或方法 4. 守护线程 5. 线程互斥锁 6. GIL全局解释器锁(******) 7. 死锁与递归锁 1.进程间通信 进程之间通信必须找到一种介质,该介质必须满足 1、是所有进程共享的 2、必须是内存空间 附加:帮我们自动处理好锁的问题 a、from multiprocessing import Manager(共享内存,但要自己解决锁的问题) b、IPC中的队列(Queue) 共享,内存,自动处理锁的问题(最常用) c、IPC中的管道(Pipe),共享,内存,需自己解决锁的问题 a、用Manager from multiprocessing import Process,Manager,Lock import time mutex=Lock() def task(dic,lock): lock.acquire() temp=dic['num'] time.sleep(0.1) dic['num']=temp-1 lock.release() if __name__ == '__main__': m=Manager() dic=m.dict({'num':10}) l=[] for i in range(10): p=Process(target=task,args=(dic,mutex)) l.append(p) p.start() for p in l: p.join() print(dic) b、用队列Queue 1)共享的空间 2)是内存空间 3)自动帮我们处理好锁定问题 from multiprocessing import Queue q=Queue(3) #设置队列中maxsize个数为三 q.put('first') q.put({'second':None}) q.put('三') # q.put(4) #阻塞。不报错,程序卡在原地等待队列中清出一个值。默认blok=True print(q.get()) print(q.get()) print(q.get()) 强调: 1、队列用来存成进程之间沟通的消息,数据量不应该过大 2、maxsize的值超过的内存限制就变得毫无意义 了解: q=Queue(3) q.put('first',block=False) q.put('second',block=False) q.put('third',block=False) q.put('fourth',block=False) #报错 queue.Full q.put('first',block=True) q.put('second',block=True) q.put('third',block=True) q.put('fourth',block=True,timeout=3) #等待3秒后若还进不去报错。注意timeout不能和block=False连用 q.get(block=False) q.get(block=False) q.get(block=False) q.get(block=False) #报错 queue.Empty q.get(block=True) q.get(block=True) q.get(block=True) q.get(block=True,timeout=2) #等待2秒后还取不出东西则报错。注意timeout不能和block=False连用 2.生产者消费者模型 该模型中包含两类重要的角色: 1、生产者:将负责造数据的任务比喻为生产者 2、消费者:接收生产者造出的数据来做进一步的处理,该类人物被比喻成消费者 实现生产者消费者模型三要素 1、生产者 2、消费者 3、队列 什么时候用该模型: 程序中出现明显的两类任何,一类任务是负责生产,另外一类任务是负责处理生产的数据的 该模型的好处: 1、实现了生产者与消费者解耦和 2、平衡了生产者的生产力与消费者的处理数据的能力 import time import random from multiprocessing import Process,Queue def consumer(name,q): while True: res=q.get() time.sleep(random.randint(1,3)) print('