Python高级——多线程_06_进程

Python高级——多线程_06_进程

进程

概念:一个运行的程序,简称是操作系统资源分配的基本单位

线程是CPU进行资源调度的基本单位

进程是操作系统进程资源分配的单位

轻量级进程 = 线程

进程开销大,线程稍小

cpu给每个进程分配的执行时间=时间片

 

进程状态:

就绪态:通过CPU的时间片进入运行态

运行态:执行等待需求的条件和变量进行等待态

等待态:等待满足条件的值后进入就绪状态

 

进程编号 identifed  PID

创建:multiprocessing.Process

参数和线程一致

常用方法:

join(参数) 等待的秒数  无参默认等待执行完成

is_alive() 进程状态

terminate()    终止进程,有延时不能立刻查看结果

属性:

name 查看子进程的名称

pid:查看当前进程的pid(进程号)

 

start() 创建和启动子进程

查看当前进程状态

multiprocessing.current_process().is_alive()

 

os.getpid()    获取当前进程PID号

os.getppid()    获取当前进程的父进程的PID

命令行  

ps -aux | grep python3 查看当前系统的所有进程

kill -9 PID号  强制退出

所有进程都有父进程,用于回收子进程的资源。所以删除了还会自动分配

 

进程间是独立数据空间-->多进程之间不共享全局变量  

创建子进程其实是对主进程进行拷贝,进程之间相互独立,访问的全局变量不是同一个,所以进程之间不共享全局变量

 

进程间通信Queue

FIFO先进先出 队列

创建:multiprocessing.Queue(长度参数)

.put 放入数据        为满,阻塞队列等待空位

参数:data:存储数值 block:阻塞 timeout = None:等待时间

 

.get 取出数据        为空,阻塞队列等待有值

参数:block:阻塞 timeout = None:等待时间

 

.full 查看是否满           返回boole

.empty 查看是否为空  返回boole

.qsize    在有些系统中不支持,一般不用

判断是否为空时,可以掩饰或者长度判断是否及时加载完成

 

进程池间通信

    不能使用multiprocessing.Queue

    使用multiprocessing.Manager().Queue()

 

 

进程池

提前准备一批的进程以备用户的需求

优点:

1.提高用户体验-理解响应需求

2.重复使用进程完成任务,节约进 程的创建和释放的额资源开销

 

创建 multiprocessing.Pool(参数) 参数:进程池中进程的数量       

添加任务 pool.apply(方法名)    

apply在添加任务时,会等待任务添加完成才会继续向下执行,阻塞-同步

apply_async 在添加任务时,不会等待任务执行完 ,异步

 

关闭进程池 不允许再添加新任务   Pool.close()

等到进程池完成所有进程    Pool.join()

 

进程和线程的对比

区别:

1.进程不共享全局变量;线程共享,但需注意资源竞争的问题,解决办法:互斥锁或线程同步

2.创建进程的资源大,线程的小

3.进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位

4.线程不能独立执行,必须依存在进程中

5.多进程开发比单进程多线程开发稳定性要强

 

多进程:

优:可以用多核    缺:资源开销大

多线程:

优:资源开销小    缺:稳定性不如多进程高