1、进程的概念
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
2、Process进程类的语法结构
Process([group [, target [, name [, args [, kwargs]]]]])
group:指定进程组,使用None,一般不用设置
target:执行的函数名
name:进程名
args:以元组方式给执行任务传参
kwargs:以字典方式给执行任务传参
3、进程的创建
导入进程模块
import multiprocessing
创建子进程
进程名 = multiprocessing.Process(target = 函数名)
4、进程的常用方法和属性
start():启动子进程
join:主进程等待当前子进程执行结束后再执行后面的代码
terminate():立即销毁子进程
查看当前进程:变量名 = multiprocessing.current_process()
查看当前进程编号:current_process.pid, os.getpid()
查看父进程编号:os.getppid
根据进程编号杀死进程:os.kill(os.getpid(), 9)
5、注意点
进程间相互独立,不共享全局变量
默认主进程会等待所有的子进程执行完成程序再退出,设置守护主进程后,子进程会在主进程退出后直接销毁:当前子进程名.daemon = True
6、进程间通信 Queue
创建消息队列:队列名 = multiprocessing.Queue(队列中最大消息个数)
队列可以放入任意数据类型:队列名.put(要放入的数据),取值:get()
.put():如果队列满了,需要等待队列有空闲位置才能放入数据,否则一直等待, .put_nowait():如果队列满了,不等待,放入不成功直接崩溃,建议使用put
.get():如果队列空了,要等待队列有值后才能获取队列中的数据,.get_nowait():队列为空不等待,同样会崩溃
.full():查看队列是否满了,满了返回True,否则返回False; .qsize():查看队列数据个数,不建议使用.empty
7、进程池
进程池可以根据任务执行情况自行创建进程,合理利用进程完成多任务。
创建进程池:进程池名 = multiprossing.Pool(最大进程数),提示:使用进程池创建的进程是守护主进程的状态,默认自己通过Process创建的进程是:不守护主进程的状态
选择同步或异步执行任务
同步(一个任务执行完后,另一个任务才执行):进程池名.apply(函数名)
异步(任务执行不会等待,多个任务一起执行):进程池名.apply_async(函数名)