一、操作系统概念
1 并发编程: 2 一个程序 可以在同一时刻做多件事情 3 解决程序中的IO操作影响程序效率的问题 4 5 操作系统概念、来源 6 输入输出--大部分时间都不会占用CPU,且会降低你程序的效率 7 # input/print 8 # 文件 读数据、取数据 9 # 网络操作 : 往网线上 发送请求 写 10 # 读 从网络上获取数据 11 多道程序系统 12 分时操作系统:通过时间片轮转算法去调度作业 13 14 通用操作系统: 15 16 现代操作系统: 17 基于多道批处理系统和分时系统 18 # 多个程序、作业在遇到IO操作的时候,操作系统会帮助你进行切换 19 # 让CPU的利用率得到最大的提高
二、进程初识
进程:运行中的程序
操作系统只负责管理调度进程
进程是操作系统中资源分配的最小单位;--记住
每一个运行中的程序都需要有自己的内存、资源,都分配给进程
记录执行的状态,管理自己的内存资源
在Python中,每一个运行中的程序,都是一个进程
一个进程,就能做一件事
如果有多个进程---就可以做多个事儿
multiprocess 例子 异步同步
1 import os 2 import time 3 # print(os.getpgid()) 4 # time.sleep(100) 5 from multiprocessing import Process 6 # def func(num): 7 # print(num,os.getpid()) 8 # time.sleep(100) 9 # 10 # if __name__=='__main__': #windows需要增加,创建子进程import父进程内容不断引入 11 # print( os.getpid()) 12 # p=Process(target=func,args=(10,)) #创造了一个进程,必须是元祖传参 13 # p.start() #开启进程 又申请了一个进程,与上面函数中不一致 14 # print(os.getpid()) #1中的 15 # 2528 16 # 2528 为何先打印 17 # 10 7356 --- 开启进程是有时间开销的
异步可以有效地提高程序的效率
进程与进程之间都是异步的
开启进程是有时间开销的
几个概念:主进程、子、父
三、进程进阶
进程进阶:
# 什么是进程 : 运行中的程序,计算机中最小的资源分配单位
# 程序开始执行就会产生一个主进程
# python中可以主进程中用代码启动一个进程 —— 子进程
# 同时主进程也被称为父进程
# 父子进程之间的代码执行是异步的,各自执行自己的
# 父子进程之间的数据不可以共享
# 主进程会等待子进程结束之后再结束
父子进程之间的数据不可以共享--例子及说明
n = 100 def func(): global n n = 0 print('_______') time.sleep(10) # func() if __name__ == '__main__': Process(target=func).start() time.sleep(1) print(n)
进程结束:主进程会等待子进程结束之后再结束
开启多个子进程:重要!
例子 发邮件
1 def func(num): 2 time.sleep(1) #阻塞,阻塞状态;1s之后全部随机的打印出来 3 print('_'*num) 4 5 # if __name__=='__main__': 6 # for i in range(10): 7 # Process(target=func, args=(i,)).start() 8 # print('over') 9 # 10 # Process(target=func, args=(1,)).start() 11 # Process(target=func, args=(2,)).start() 12 # Process(target=func, args=(3,)).start() 13 # Process(target=func, args=(4,)).start() 14 if __name__=='__main__': 15 for i in range(10): 16 p=Process(target=func, args=(i,)) 17 p.start() 18 p.join() #阻塞直到子进程执行完毕之后再继续,但每次打印都阻塞了。优化,逐一join 19 print('over')
1 def func(num): 2 time.sleep(1) #阻塞,阻塞状态;1s之后全部随机的打印出来 3 print('_'*num) 4 if __name__=='__main__': 5 l=[] 6 for i in range(10): 7 p=Process(target=func, args=(i,)) 8 p.start() 9 l.append(p) 10 for p in l: 11 p.join() 12 print('十条信息已经都发送over')
守护进程:守护进程也是一个子进程-------一般报活用
当主进程的代码执行完毕后自动结束的子进程叫做守护进程
打印6次--6次--21次例子,易考到
1 def deamon_func(): 2 while True: 3 print('life') 4 time.sleep(0.5) 5 if __name__=='__main__': 6 p=Process(target=deamon_func) 7 p.daemon=True #守护进程必备 8 p.start() 9 for i in range(3): 10 print(i*'*') 11 time.sleep(1) 12 13 14 结果: 15 16 life 17 life 18 * 19 life 20 life 21 ** 22 life 23 life
1 import time 2 def deamon_func(): 3 while True: 4 print('我还活着') 5 time.sleep(0.5) 6 7 def wahaha(): 8 for i in range(10): 9 time.sleep(1) 10 print(i * '#') 11 12 if __name__ == '__main__' : 13 p2 = Process(target=wahaha) 14 p2.start() 15 p = Process(target=deamon_func) 16 p.daemon = True #守护进程必备 17 p.start() 18 for i in range(3): 19 print(i*'*') 20 time.sleep(1) 21 p2.join() #不加6次,加上21次 22 23 结果: 24 25 我还活着 26 我还活着 27 * 28 我还活着 29 30 我还活着 31 ** 32 我还活着 33 # 34 我还活着 35 ## 36 我还活着 37 我还活着 38 我还活着 39 ### 40 我还活着 41 我还活着 42 #### 43 我还活着 44 我还活着 45 ##### 46 我还活着 47 我还活着 48 ###### 49 我还活着 50 我还活着 51 ####### 52 我还活着 53 我还活着 54 ######## 55 我还活着 56 我还活着 57 ######### 58 59 不加join结果: 60 61 我还活着 62 我还活着 63 * 64 65 我还活着 66 我还活着 67 ** 68 # 69 我还活着 70 我还活着 71 ## 72 ### 73 #### 74 ##### 75 ###### 76 ####### 77 ######## 78 #########
小结。。
# 开启一个子进程 start # 子进程和主进程是异步 # 如果在主进程中要等待子进程结束之后再执行某段代码:join # 如果有多个子进程 不能在start一个进程之后就立刻join,把所有的进程放到列表中,等待所有进程都start之后再逐一join # 守护进程 —— 当主进程的"代码"执行完毕之后自动结束的子进程叫做守护进程
四、进程锁、队列等概念
锁、队列稍微重要一些
锁牺牲效率,但保证了数据的安全--例子
多进程同时抢购余票-例子,买票时记得上锁,这样只有1个成功了
1 # #文件db的内容为:{"count":1} 2 # #注意一定要用双引号,不然json无法识别 3 # #并发运行,效率高,但竞争写同一文件,数据写入错乱 4 from multiprocessing import Process,Lock 5 import time,json,random 6 def search(): 7 dic=json.load(open('db')) 8 print('