通常使用multiprocessing创建进程,父进程只用作进程的创建和回收,不做其他工作。
multiprocessing 进程对象属性
p.start() 启动进程
p.join() 回收进程
p.join() 回收进程
p.is_alive() 判断进程生命周期状态 返回True False
p.name 进程名称 默认为Process-1 如果起名字则为自 定义名称
p.pid 创建的进程的PID
p.daemon
默认值为False 父进程退出不会影响子进程运行
如果设置为True 则父进程退出子进程也会退出
如果设置为True 则父进程退出子进程也会退出
* daemon的设置必须在start前
* 如果设置daemon为True 则不再使用join
* 如果设置daemon为True 则不再使用join
创建自己的进程类
1. 继承Process类
2. 重写__init__ 并且调用父类的__init__
3. 重写run方法,此时生成对象后 调用start就会自动运 行run
2. 重写__init__ 并且调用父类的__init__
3. 重写run方法,此时生成对象后 调用start就会自动运 行run
多进程
优点 : 能并行执行多个任务,提高效率
创建方便,运行独立,不受其他进程影响
数据安全
缺点 : 进程的创建和删除都需要消耗计算机的资源
创建方便,运行独立,不受其他进程影响
数据安全
缺点 : 进程的创建和删除都需要消耗计算机的资源
进程池技术
产生原因 : 如果有大量任务需要多进程完成,且可能需要频繁的创建和删除进程,给计算机带来大量的资源消耗。
原理 : 在进程池内运行一定数量进程,通过这些进程完成进程池队列中的事件,直到事件执行完毕,减少进程不断的创建删除过程。
实施操作方法:
1. 创建进程池,在进程池中放入适当进程
2. 将事件加入到进程池队列
3. 事件不断运行,直到所有事件运行完毕
4. 关闭进程池,回收进程
1. 创建进程池,在进程池中放入适当进程
2. 将事件加入到进程池队列
3. 事件不断运行,直到所有事件运行完毕
4. 关闭进程池,回收进程
from multiprocessing import Pool
pool = Pool(processes)
功能 : 创建进程池对象
参数 : 表示进程池中有多少进程
功能 : 创建进程池对象
参数 : 表示进程池中有多少进程
pool.apply_async(func,args,kwds)
功能 : 将事件放入进程池队列
参数 : func 要执行的事件
args 给func用元组传参
kwds 给func用字典传参
返回值 : 返回事件对象 通过get()方法获取事件函数返 回值
功能 : 将事件放入进程池队列
参数 : func 要执行的事件
args 给func用元组传参
kwds 给func用字典传参
返回值 : 返回事件对象 通过get()方法获取事件函数返 回值
pool.apply(func,args,kwds)
功能 : 将事件放入进程池队列
参数 : func 要执行的事件
args 给func用元组传参
kwds 给func用字典传参
功能 : 将事件放入进程池队列
参数 : func 要执行的事件
args 给func用元组传参
kwds 给func用字典传参
pool.close()
功能 : 关闭进程池,不能再添加新的事件
功能 : 关闭进程池,不能再添加新的事件
pool.join()
功能 : 阻塞等待回收进程池
功能 : 阻塞等待回收进程池
pool.map(func,iter)
功能 : 将要完成的事件放入进程池
参数 : func 要完成的事件函数
iter 可迭代对象给func传参
返回值 : 事件函数的返回值列表
功能 : 将要完成的事件放入进程池
参数 : func 要完成的事件函数
iter 可迭代对象给func传参
返回值 : 事件函数的返回值列表
cookie
获取文件大小
os.path.getsize(path)
功能 : 获取一个文件的大小
参数 : 文件
os.path.getsize(path)
功能 : 获取一个文件的大小
参数 : 文件
进程间通信
进程间由于空间独立,资源无法互相直接获取,此时在不同的进程间进行数据传递就需要专门的通信方法
进程间通信方法(IPC)
管道 消息队列 共享内存 信号 信号量 套接字
管道 消息队列 共享内存 信号 信号量 套接字
管道通信 Pipe
管道 : 在内存中开辟一段空间,形成管道结构,管道对多个进程可见,进程可以对管道进行读写操作
multiprocess ---》 Pipe
fd1,fd2 = Pipe(duplex = True)
功能 : 创建一个管道
参数 : 默认为双向管道
如果设置为False 则为单向管道
返回值 :如果双向管道,fd1 fd2都可以进行读写操作
如果是单向管道,则fd1 只可读,fd2只可写
功能 : 创建一个管道
参数 : 默认为双向管道
如果设置为False 则为单向管道
返回值 :如果双向管道,fd1 fd2都可以进行读写操作
如果是单向管道,则fd1 只可读,fd2只可写
fd.recv()
功能 : 从管道读取内容
返回值 : 读到的内容
功能 : 从管道读取内容
返回值 : 读到的内容
* 如果管道无内容则阻塞
fd.send(data)
功能: 向管道写入内容
参数: 要发送的内容
功能: 向管道写入内容
参数: 要发送的内容
* 几乎可以发送所有python支持的数据
消息队列
队列 : 先进先出
在内存中开辟队列结构空间,多个进程可以向队列投放消息,在取出的时候按照存入顺序取出
创建队列
q = Queue(maxsize = 0)
功能 : 创建队列
参数 : maxsize 默认表示根据系统分配空间存储消息
如果传入一个正整数则表示最多存放多少条消息
返回 : 队列对象
q = Queue(maxsize = 0)
功能 : 创建队列
参数 : maxsize 默认表示根据系统分配空间存储消息
如果传入一个正整数则表示最多存放多少条消息
返回 : 队列对象
q.put(data,[block,timeout])
功能: 存放消息
参数: data 存入的消息 (python数据类型)
block 默认为True表示当队列满的时候阻塞
设置为False则表示非阻塞
timeout 当block为True表示超时时间
功能: 存放消息
参数: data 存入的消息 (python数据类型)
block 默认为True表示当队列满的时候阻塞
设置为False则表示非阻塞
timeout 当block为True表示超时时间
data = q.get([block,timeout])
功能 : 取出消息
参数 : block 默认为True 当队列空时阻塞
设置为False表示非阻塞
timeout 当block为True时表示超时时间
返回值 : 返回获取的消息
功能 : 取出消息
参数 : block 默认为True 当队列空时阻塞
设置为False表示非阻塞
timeout 当block为True时表示超时时间
返回值 : 返回获取的消息
q.full() 判断队列是否为满
q.empty() 判断队列是否为空
q.qsize() 判断当前队列有多少消息
q.close() 关闭队列
q.empty() 判断队列是否为空
q.qsize() 判断当前队列有多少消息
q.close() 关闭队列
共享内存
在内存中开辟一段空间,存储数据,对多个进程可见。每次写入共享内存中的数据会覆盖之前的内容
from multiprocessing import Value
obj = Value(ctype,obj)
功能 : 开辟共享内存空间
参数 : ctype 字符串 要转变的c的数据类型
对比类型对照表
obj 共享内存的初始化数据
返回 : 共享内存对象
功能 : 开辟共享内存空间
参数 : ctype 字符串 要转变的c的数据类型
对比类型对照表
obj 共享内存的初始化数据
返回 : 共享内存对象
obj.value 表示共享内存中的值。对其修改或者使用即 可
obj = Array(ctype,obj)
功能: 开辟共享内存
参数: ctype 要转化的c的类型
obj 要存入共享内存的数据
列表 将列表存入共享内存,数据类型 一致
正整数 表示开辟几个数据空间
功能: 开辟共享内存
参数: ctype 要转化的c的类型
obj 要存入共享内存的数据
列表 将列表存入共享内存,数据类型 一致
正整数 表示开辟几个数据空间
管道 消息队列 共享内存
开辟空间 内存 内存 内存
读写方式 两端读写 先进先出 操作覆盖内存
双向/单向
双向/单向
效率 一般 一般 较快
应用 多用于两端 使用广泛 复杂,需要 通信 同步互斥机制