1.多任务
1.1 多任务的概念
多任务就是同一时间同时执行多个任务
多任务可以充分利用CPU资源,提高执行效率
1.2 多任务的两种表现形式
1.2.1并发
任务数量远大于CPU的核心数时
在一段时间内,交替执行多任务
1.2.2并行
任务数量小于或等于CPU核心数时
在一段时间内同时的一起执行多个任务
在一段时间内,CPU多个内核同时执行任务,做的真正的同时执行多个任务
2.进程的介绍
在Python中想要实现多任务的话,可以使用多进程来完成
2.1 进程的概念
进程(Process)是资源分配的最小单位,是操作系统进行资源分配和调度运行的基本单位。
2.2 多进程的作用
def a():
print("这是任务a")
def b():
print("这是任务b")
a()
b()
# 主进程:程序运行后会默认的创建一个进程,这个进程就叫主进程。
# 可以在程序运行之后创建新的进程,这个新创建的就叫子进程。
2.3多进程完成多任务
2.3.1进程的创建
·导入进程包:import multprocessing
·通过进程类创建进程对象:进程对象 = multprocessing.Process()
·启动进程执行多任务:进程对象.start()
2.3.2通过进程类创建进程对象
进程对象 = multProcessing.Process(target=任务名,name=进程名(一般不用设置),group=进程组(目前用None))
# 导入进程包
import multiprocessing
import time
def coding():
"""编写代码"""
for i in range(3):
print("正在写代码")
time.sleep(1)
def music():
"""听歌"""
for i in range(3):
print("正在听歌")
time.sleep(1)
if __name__ == '__main__':
# coding()
# music()
# 通过进程类创建进程对象
coding_process = multiprocessing.Process(target=coding)
music_process = multiprocessing.Process(target=music)
# 通过进程对象启动子进程
coding_process.start()
music_process.start()
2.2.4 获取进程编号
作用:当进程数量过多时,如果没法区分主进程和子进程,那么就无法有效的进行进程管理,为方便管理,实际上每个进程都有一个编号
获取进程编号的方式:
1.获取当前进程编号:os.getpid()
2.获取当前父进程编号:os.getppid()
# 导入进程包
import multiprocessing
import time
import os
def coding(num):
"""编写代码"""
for i in range(num):
print("写代码的进程编号:",os.getpid())
print("写代码的父进程编号:", os.getppid())
print("正在写代码")
time.sleep(1)
def music(num):
"""听歌"""
for i in range(num):
print("听歌的进程编号:", os.getpid())
print("听歌的父进程编号:", os.getppid())
print("正在听歌")
time.sleep(1)
if __name__ == '__main__':
# coding()
# music()
# 通过进程类创建进程对象
print("这是主进程:",os.getpid())
coding_process = multiprocessing.Process(target=coding,args=(3,))
music_process = multiprocessing.Process(target=music,kwargs={'num':5})
# 通过进程对象启动子进程
coding_process.start()
music_process.start()
2.2.5进程中的注意点
1.进程之间不共享全局变量
2.主进程会等待所有子进程执行结束再结束
2.2.6进程之间不共享全局变量
# 导入进程包
import multiprocessing
import time
# 定义全局变量
my_list = []
def write_data():
"""写数据"""
for i in range(3):
my_list.append(i)
print("添加了:",i)
print("这是写数据的子进程写入的表:",my_list)
def read_data():
"""读数据"""
print("这是读数据的子进程读的表:",my_list)
if __name__ == '__main__':
"""通过进程类创建进程对象"""
write_proccess=multiprocessing.Process(target=write_data)
read_process=multiprocessing.Process(target=read_data)
write_proccess.start()
# 主进程等待写入子进程执行完之后,再往下执行
# time.sleep(2)
# 进程阻塞等待
write_proccess.join() # 等待write.process全部执行完之后再继续执行
read_process.start()
2.2.7主进程会等所有子进程执行结束之后再结束
import multiprocessing
import time
def work():
for i in range(10):
print("正在工作中")
time.sleep(0.2)
if __name__ == '__main__':
"""创建子程序"""
work_process = multiprocessing.Process(target=work)
"""启动子进程"""
work_process.start()
time.sleep(1)
print("主进程执行完毕!")
2.2.8守护主进程
设置守护主进程:子进程对象.darmon = True
销毁子进程:子进程对象.terminate()
import multiprocessing
import time
def work():
for i in range(10):
print("正在工作中")
time.sleep(0.2)
if __name__ == '__main__':
"""创建子程序"""
work_process = multiprocessing.Process(target=work)
# """方法1:设置守护主进程"""
# work_process.daemon = True
"""启动子进程"""
work_process.start()
time.sleep(1)
"""方法2:在主进程结束之前手动销毁子进程"""
work_process.terminate()
print("主进程执行完毕!")