Python3多进程学习笔记

多任务:同一时间跑多个任务
多任务的试行方式
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值