多任务:同一时间跑多个任务
多任务的试行方式
1.并发(单核处理器交替执行多个任务)
2.并行(真正意义同时执行,多核每个核同时运行)
单进程:
程序运行
↓
创建主进程
↓
运行程序
多进程:
程序运行→创造子进程→与主进程同时运行程序
↓
创建主进程
↓
运行程序
进程创建步骤
1.导入进程包
import multiprocessing
2.通过进程类创建进程对象
进程对象=multiprocessing(target=任务名,args=以元组的形式给其传参,kwargs=以字典的形式给他传参,name=进程名,group=进程组《一般为None》)
3.启动执行任务
进程对象.start()
获取进程编号
1.获取当前进程编号:
os.getpid()
使用:
import os
pid = os.getpid()
print(pid)
2.获取当前父进程编号:
os.getppid()
使用:
def work():
print("work进程编号:",os.getpid())
print("work父进程编号:",os.getppid())
进程的注意点
主进程会等待所有的子进程执行结束再结束
import time
import multiprocessing
def work():
for i in range(10):
print("working"+str(i))
time.sleep(0.2)
if __name__=='__main__':
work_process=multiprocessing.Process(target=work,name="work_process")
work_process.start()
time.sleep(1)
print("主进程完成了")
如何解决??
设置守护子进程,主进程结束子进程自动销毁
增加:work_process.daemon=True
import time
import multiprocessing
def work():
for i in range(10):
print("working"+str(i))
time.sleep(0.2)
if __name__=='__main__':
work_process=multiprocessing.Process(target=work,name="work_process")
work_process.daemon=True
work_process.start()
time.sleep(1)
print("主进程完成了")
import multiprocessing
import time
import os
def dance(times,Time):
print("跳舞进程编号:",os.getpid())
print("跳舞进程父进程编号:",os.getppid())
for i in range(times):#跳舞次数
print("dancing·····")
time.sleep(Time)#跳舞时间
def sing(times,Time):
print("唱歌进程编号:",os.getpid())
print("跳舞进程父进程编号:",os.getppid())
for i in range(times):#唱歌次数
print("singing·····")
time.sleep(Time)#唱歌时间
if __name__ == '__main__':
print("主进程编号:",os.getpid())
#主进程创建了两个对象(sing,dance)
#元组传参按照形参顺序传递
dance_process=multiprocessing.Process(target=dance,args=(3,0.5,),name="dance_process")
#字典传参按照key名传参
sing_process=multiprocessing.Process(target=sing,kwargs={"Time":0.5,"times":3,})
#启动这两个任务产生了两个进程
dance_process.start()
sing_process.start()
应用样例:
#高并发文件拷贝器
import os
import multiprocessing
#拷贝函数
def copy_file(file_name,source_dir,dest_dir):
source_path=source_dir+"\\"+file_name#源文件路径
dest_path=dest_dir+"\\"+file_name#目标文件路径
with open(source_path,"rb") as source_file:#以只读方式打开源文件
with open(dest_path,"wb") as dest_file:#以可写方式打开目标文件
while True:#一直循环下去
data=source_file.read(1024)#一次度1kb
if data:#只要数据不是空的
dest_file.write(data)#就写数据
else:#结束
print("完成拷贝:"+file_name)
break
if __name__=='__main__':
source_dir="F:\\hack\\工作台\\新建文件夹"#源文件夹
dest_dir="F:\\hack\\工作台\\test"#目标文件夹
try:
os.mkdir(dest_dir)#创建文件夹
except:
print("目标文件夹已经存在")
file_list=os.listdir(source_dir)#获取文件夹列表
for file_name in file_list:
#拷贝文件方法copy_file(file_name,source_dir,dest_dir)
sub_process=multiprocessing.Process(target=copy_file,args=(file_name,source_dir,dest_dir))
sub_process.start()