一、使用fork( )创建子进程(不能跨平台,只在Linux下执行)
1、编写完毕的代码,在没有运行的时候,称之为程序, 正在运行着的代码,称为进程,
进程,除了包含代码以外,还有需要运行的环境等,所以和程序是有区别的
2、使用os模块的fork( )函数创建一个子进程,主进程从一开始导入import os 开始执行,即从第一行开始执行,子进程从第四行os.fork( )创建出来开始进行,两个进程下面的代码完全相同,但是两个进程分开各自执行各自的代码,互不干扰。
3、主进程不会等待 fork( ) 函数创建出来的子进程
4、主进程的进程标识码大于0,子进程的进程标识码为0
示例:主进程从头开始执行,子进程从fork创建出来开始执行,分开代码执行,互不干扰,
且主进程不会等待 fork( ) 函数创建出来的子进程
5、getpid( )、getppid( )
getpid( )返回当前进程标识码 , getppid( ) 返回父进程标识码
注意:
1、主进程的进程标识码 > 0, 主进程没有父进程,所以用getpid( )查看本身的进程标志码
2、子进程有父进程,本身的进程标识码用getpid( )查询,父进程的用getppid( )查询
3、父进程中 os.fork( ) 的返回值,就是刚刚创建出来的子进程的进程标志码
5、全局变量在多个进程中不共享
多进程中,每个进程中所有数据(包括全局变量)都各有拥有一份,互不影响。
进程可以完成多任务,但是,进程与进程之间是独立的,进程和进程之间想要实现通信,需要网络。
二、使用Process创建子进程(可跨平台使用)
1、导入模块,创建一个Process实例,用start( )方法启动
p=Process( target = test ) #创建出子进程,当子进程被启动后,会去执行 test 函数的内容
p.start( ) #开启子进程,执行函数内容,主进程继续向下执行,子进程去执行函数内容,执行完子程序消失
2、在创建子进程的时候并传递参数
3、使用 Process 创建出来的子进程,主进程会等待子进程结束以后,主进程才会结束( 注意是结束,而不是继续执行),而使用fork( )创建出来的子进程,主进程不会对子进程等待
4、join( ) 方法,使主进程等待子进程结束后再继续往下运行,通常用于进程间的同步。
也可以 join(time):等待子进程 time 秒,主进程继续向下执行,若不写参数,默认就是等待子进程结束
5、实例:
一般使用元组进行传递参数,元组中的“xiaohua”和“18”分别传给了 test 函数的形参name和age,而kwargs={ "m":"18" }则传给了关键字参数 **kwargs
也可以使用列表来传参:
6、通过类创建子进程
三、进程池
四、进程间通信
1、队列:先进先出,可以存储各种数据类型
2、队列的相关操作
q = Queue( 3 ) 创建队列,并指定队列的容量大小为 3(不指定,默认为无限多个)
q.qsize( ) 查看队列里有多少个内容
q.put( ) 向队列中放入内容 q.put_nowait( ) 以非阻塞的方式,向队列中放入内容
q.get( ) 从队列出取出内容(先进的先出) q.get_nowait( ) 以非阻塞的方式,从队列出取出内容
q.empty( ) 判断队列是否为空,为空返回True
q.full( ) 判断队列是否为满,为满返回True
3、使用队列,完成进程间的数据通信
4、在进程池中使用队列进行通信,需要从 multiprocessing 导入 Manager,通过 q = Manager( ).Queue( )创建队列