概述
python为了提高运行效率,可以 创建进程,让CPU同时执行多个任务
应用场景
计算密集型的任务主要消耗CPU,所以计算密集型的任务一般使用多进程。
如:科学计算、视频解码
操作系统与创建进程
为了提高运行效率,主流操作系统提供创建进程的函数,供程序员调用。
注意:不同的操作系统,提供创建进程的 函数 可能不同,UNIX、linux、Mac OS相同,但MS Windows系统与前几种不同。
由于python是跨平台的,通过类
multiprocessing.Process 可以在主流操作系统中实现创建进程的功能
例子
模拟一个进程 读取1T的大文件,读取速度慢
import time
import os
def task():
# 模拟耗时任务,如:读取1T文件
for i in range(101):
print("读取文件,进度:{}%".format(i))
time.sleep(0.5)
print("pid:{},父pid:{}".format(os.getpid(),os.getppid()))
task()
Process使用说明
创建对象
语法:
Process([group [, target [, name [, args [, kwargs]]]]])
参数说明:
- group:一般不使用
- target:表示调用对象
- name:为别名
- args:表示调用对象的位置参数元组
- kwargs:表示调用对象的关键字参数字典
常用属性
name:当前进程别名,在实例化时通过参数name指定,默认为Process=N,N为从1开始递增的整数
pid:当前进程实例的pid
常用方法
start():启动进程实例
is_alive():判断进程实例是否还在执行,返回布尔值
join([timeout]):参见python-Process之join()的使用
run():参见python-Process子类创建进程
terminate():不管任务是否完成,立即终止
例子:多进程读取文件
2个进程读取大文件,速度会快一半
import time
import os
from multiprocessing import Process
def task():
# 模拟耗时任务,如:读取1T文件的前50%
for i in range(51):
print("子进程:{},父进程:{},读取文件,进度{}".format(os.getpid(),os.getppid(),i))
time.sleep(0.5)
def task2():
# 模拟耗时任务,如:读取1T文件的后50%
for i in range(51,101):
print("子进程:{},父进程:{},读取文件,进度{}".format(os.getpid(),os.getppid(),i))
time.sleep(0.5)
if __name__ == "__main__":
print("主程序pid:{},父pid:{}".format(os.getpid(),os.getppid()))
# 创建子进程,该子进程执行 task() 函数
p1 = Process(target=task)
# 启动子进程
p1.start()
# 再创建子进程,该子进程执行 task2() 函数
p2 = Process(target=task2)
# 启动子进程
p2.start()