1 # 多道技术:让多个程序在内存中,遇到IO阻塞,切换到其他程序以达到CPU资源最大化的技术 2 # 分时系统:在CPU被程序长时间占用时,切换其他任务,以达到多个任务像是同时运行一样 3 4 # 并行:在多核CPU中,每个核心一起并列执行任务,叫做并行 5 # 串行:对于一个CPU核心来说,按顺序执行每个任务,叫做串行 6 # 并发:对于一个CPU核心,在遇到IO阻塞,或者一个线程长时间占用CPU时,切换执行其他任务,以达到CPU最大效率的方式,就是并发
1 # 进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。 2 # 线程的维度要比进程更细,好比一列火车(进程),一节车厢(线程)
1 # 同步:程序顺序执行过程中,执行一个任务,要等待一个任务执行结束,就是同步 2 # 异步:程序执行过程,发送一个消息,但不管结果如何,继续执行,就是叫异步 3 4 # 阻塞:CPU执行任务中,遇到IO接口,造成CPU等待的现象就是叫做阻塞 5 # 非阻塞:CPU执行任务中,程序没有IO接口,CPU不会等待输入输出,就是非阻塞 6 7 8 # 同步和异步与阻塞和非阻塞之间的关系: 9 # 同步和异步是相对于被执行的任务而言,阻塞和非阻塞是相对执行任务的人(CPU)而言的 10 # 同步是要等执行结果返回之前,不能做其他事 11 # 异步是交给别人处理事情,告诉执行结果就行,自己做其他事 12 # 阻塞是处理一件事,需要返回结果,但是不影响做其他事 13 # 非阻塞是处理一件事,不需要等待返回结果,也直接去做其他事
再看下面代码:
1 import time 2 from multiprocessing import Process, Queue 3 4 def cook(plate): 5 """ 6 厨师(生产者) 7 """ 8 9 time.sleep(0.1) # 厨师每0.1秒做出一个蛋糕 10 plate.put("蛋糕") 11 print("厨师做出了一块蛋糕...") 12 13 def eat(plate): 14 """ 15 食客(消费者) 16 """ 17 while 1: 18 time.sleep(0.01) # 每个食客每0.01秒就把蛋糕吃完了 19 cake = plate.get() 20 if cake==None:break 21 print("一块蛋糕被吃掉了") 22 23 24 if __name__ == '__main__': 25 plate = Queue() 26 lst = [] 27 for i in range(3): 28 # 生成三个生产者 29 cooker = Process(target=cook, args=(plate, )) 30 cooker.start() 31 lst.append(cooker) 32 33 eater = Process(target=eat, args=(plate, )) 34 eater.start() 35 # 产生了两个消费者 36 eater1 = Process(target=eat, args=(plate, )) 37 eater1.start() 38 39 for j in lst: 40 j.join() 41 # 在生产者生产完成后 42 43 plate.put(None) 44 plate.put(None) 45 # 发送两个None,确保每个消费者都得到一个None, 46 # 既可以蛋糕都被吃掉,也避免厨师不作蛋糕了,食客还在等待