多任务
概念:同一时间执行多个任务
作用:充分利用CPU资源,提高程序执行效率
表现形式:并发(操作系统交替执行多个任务,同一时间只有一个任务在执行)、并行(操作系统给每个CPU安排一个任务,这些任务是真正意义上的同时执行)
在Python中可以使用多进程和多线程来实现多任务
多进程
进程:操作系统进行资源分配的基本单位。简单来说,一个运行起来的程序就是一个进程
- 多进程实现多任务的步骤
1)导包:import multiprocess
2)创建进程对象:进程对象 = multiprocess.Process(target=任务名)
参数target
:执行的目标任务名,代码里就是指定的函数名
3)启动进程(通过进程对象启动进程来执行指定的任务):进程对象.start()
1. 单任务:
import time
def crosstalk():
for i in range(2):
print('听相声...')
time.sleep(0.5)
def drink():
for i in range(2):
print('喝茶...')
time.sleep(0.5)
if __name__ == '__main__':
crosstalk()
drink()
2. 多任务:
import time
import multiprocessing
def crosstalk():
for i in range(2):
print('听相声...')
time.sleep(0.5)
def drink():
for i in range(2):
print('喝茶...')
time.sleep(0.5)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=crosstalk)
p2 = multiprocessing.Process(target=drink)
p1.start()
p2.start()
3. 带有参数的多任务:
两种传参方式:元组(args)和字典(kwargs)
以元组方式传参,参数顺序一定要保持一致
以字典方式传参,参数名一定要保持一致
import time
import multiprocessing
def crosstalk(num):
for i in range(num):
print('听相声...')
time.sleep(0.5)
def drink(num, name):
for i in range(num):
print('%s喝茶...'%name)
time.sleep(0.5)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=crosstalk, args=(3,)) #元组元素个数为1时,需在后面加逗号,
p2 = multiprocessing.Process(target=drink, kwargs={"num": 2, "name": "明明"})
p1.start()
p2.start()
4. 获取进程编号:
1)导包:import os
2)获取当前进程编号:os.getpid()
获取父进程编号:os.getppid()
注意事项
- 默认主进程会等待所有的子进程执行结束后再结束
- 设置守护主进程,当主进程结束,子进程直接销毁:
子进程对象.daemon = True
实例:文件多任务拷贝
import os
import multiprocessing
def copy_file(file_name, source_dir, dest_dir): #实现文件内容的拷贝
source_file = source_dir + '/' + file_name #原文件
dest_file = dest_dir + '/' + file_name #目标文件
with open(source_file, 'rb') as source_file: #以读方式打开原文件
with open(dest_file, 'wb') as dest_file: #以写方式打开目标文件
while True:
data = source_file.read(1024) #每次读1KB
if data:
dest_file.write(data)
else:
break
if __name__ == '__main__':
source_dir = 'E:\\test' #原文件夹
dest_dir = 'E:\dest_dir' #目标文件夹
try: #创目标文件夹
os.mkdir(dest_dir)
except:
print("该文件夹已存在")
file_list = os.listdir(source_dir) #将原文件夹中的文件名放在列表中
for file_name in file_list: #为每一个文件创建一个拷贝进程
work_process = multiprocessing.Process(target=copy_file,
args=(file_name, source_dir, dest_dir))
work_process.start()
总结
本文是边看视频边写的学习笔记,做个记录加深印象。