Table of Contents
不知道,不熟悉的参数,一定要用关键字传参
open中的大坑
一定要多想文件的游标 灵活运用seek和tell
seek使用
f.seek(offset, where)
offset:开始的偏移量
where参数表示offset参数的意义。
0:表示从文件起始位算起(绝对位置)
1:表示从当前位置算起(相对位置)
2:表示从文件尾开始算起
offset:开始的偏移量
where参数表示offset参数的意义。
0:表示从文件起始位算起(绝对位置)
1:表示从当前位置算起(相对位置)
2:表示从文件尾开始算起
进程状态
三态
就绪态 : 进程具备执行条件,等待分配cpu资源
运行态 : 进程占有cpu时间片正在运行
等待态 : 进程暂时停止运行,让出cpu
五态
新建,销毁
fork的注意事项
1.子进程有父进程所有代码,但是没有执行父进程代码,子进程与父进程的变量相互独立
2.子父进程的运行顺序不一定
3.创建进程是利用fork的返回值不同,结合if来执行
4,父子进程有个子进程特征比如PID,PCB等
5.父进程开辟的空间,子进程也有,但是父子进程的操作是相互独立的
子进程是从fork后开始执行
fork常用函数
os.getpid() 获取进程的pid值
os.getppid() 获取父进程pid值
os._exit(status) 结束一个进程,参数值是一个约定的结束状态(比如-1是异常,0是正常)
sys.exit([ststus]) 退出之后打印一下参数
孤儿进程
孤儿进程就是父进程先结束了,此时这个进程就被系统收养,孤儿系统结束,系统会处理,所以不会产生僵尸进程
僵尸进程
子进程结束,但是父进程并未处理
处理方式有
pid,status = os.wait() 阻塞等待子进程退出
pid,status = os.waitpid(pid,option)
pid=-1是任意进程退出,>0是指定pid,option 0是阻塞,WNHOANG是非阻塞
返回值pid退出的子进程pid值,status子进程退出状态
通过信号处理僵尸进程
signal.signal(signal.SIGCHLD,signal.SIG_IGN) 方便快捷处理所有子进程
mutilprocessing
mutilprocessing中可以创建多个子进程,内部也是用fork()实现
流程特点
【1】 将需要子进程执行的事件封装为函数
【2】 通过模块的Process类创建进程对象,关联函数
【3】 可以通过进程对象设置进程信息及属性
【4】 通过进程对象调用start启动进程
【5】 通过进程对象调用join回收进程
Process()
target:函数名,args是一个元组,代表位置参数,kwargs是字典,代表关键字参数
p.start(),p.start()之后才代表进程开始创建
p.join([timeout]) ,等待进程结束,timeout是最长等待时间
约定:multiprocessing中,主文件只用来管理进程,事情都在Process中做
multiprocessing创建的子进程中不能使用标准输入
Process中的属性
p.name 进程名称
p.pid 是子进程pid号
p.is_alive()查看子进程是否在周期
P.deamon 设置父子进程的退出关系,如果为True 则子进程随着父进程的退出退出,这个要在start前面设置,并且这个选项和join一般只用其一
multiprocessing 中的属性
p.name , p.pid ,p.is_alive(),p.deamon()
deamon守护进程
1.后台运行
2.生命周期很长
进程池
重复创建进程,对系统的资源消耗很大,所以这个时候可以使用线程池,统一创建,统一销毁
主进程结束 ,进程池也直接被结束
from multiprocessing import Pool
Pool(processes) 参数是数量 ,所有进程都是Pool的子进程
apply_async() 可以有返回值,三个参数(func,args,kwds),要执行的函数,元组,字典(要给函数传递的参数)
close() 是关闭进程池,不在接收新的进程
join() 等待进程池执行完毕
进程间的通信(IPC)
需要扣一扣细节问题
管道 Pipe()
fd1,fd2 = Pipe() # 默认为双向管道
如果是单向,则fd1只读,fd2只写
* 队列 Queue(maxsize=0) 最多存放消息个数
q.empty() # 有一个坑,写在文件中,读取太快,会判定为空
共享内存
char 就是 python中是string,效率高,重写就覆盖
常用类型 i,f,c,只能指定一个类型
Value(ctype,data) # ctype是类型,data是初始化数据
Array(ctype,data) # ctype是类型,data是开辟空间的大小看(可以是数值,也可以是列表)
* 本地套接字通信
满足两个没有亲缘关系的进程通信
套接字需要一个accpet和connect
AF_UNIX是第一个参数
信号量(信号灯集)
进行数值的控制,
实现方法
from multiprocessing import Semaphore
sem = Semaphore(num)
功能 : 创建信号量对象
参数 : 信号量的初始值
返回值 : 信号量对象
sem.acquire() 将信号量减1 当信号量为0时阻塞
sem.release() 将信号量加1
sem.get_value() 获取信号量数
Struct参数对照表