多任务的介绍
利用现学知识能够让两个函数或者方法同时执行吗?
不能,因为之前写的程序都是单任务的,也就是说一个函数或者方法执行完成另外一个函数或者方法才能执行,要想实现这种操作就需要使用多任务
多任务的最大好处是:充分利用CPU资源,提高程序的执行效率。
多任务的概念
多任务是指在同一时间内执行多个任务,例如:现在电脑安装的操作系统都是多任务操作系统,可以同时运行多个软件。
多任务的执行方式
并发:在一段时间内交替执行任务
并行:对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。这里需要注意多核cpu是并行的执行多任务,始终有多个软件一起执行。
进程
进程的介绍
在python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。
进程的概念
一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源保证进程的运行。
多进程的使用
导入进程包
import multiprocessing
Process进程类的说明
Process([group[,target[,name[,args[,kwargs]]])
- group:指定进程组,目前只能使用None
- target:执行的目标任务名
- name:进程名字
- args:以元组方式给执行任务传参
- kwargs:以字典方式给执行任务传参
Process创建的实例对象的常用方法:
- start():启动子进程实例(创建子进程)
- join():等待子进程执行结束
- terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
多进程完成多任务的代码
# 1. 导入进程包
import multiprocessing
import time
# 跳舞任务
def dance():
for i in range(3):
print('跳舞中...')
time.sleep(0.2)
# 唱歌任务
def sing():
for i in range(3):
print('唱歌中...')
time.sleep(0.2)
# 2. 创建子进程(自己手动创建的进程称为子进程,在__init__.py文件中已经导入的Process类)
# 2.1 group:进程组,目前只能使用None,一般不需要设置
# 2.2 target:进程执行目标任务
# 2.3 name:进程名,如果不设置,默认是Process-1,......
if __name__ == '__main__':
dance_process = multiprocessing.Process(target=dance)
sing_process = multiprocessing.Process(target=sing)
# 3. 启动进程执行对应的任务
dance_process.start()
sing_process.start()
# 主进程执行唱歌任务
# sing()
获取进程编号
获取进程编号的目的
获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由哪个主进程创建出来的。
获取进程编号的两种操作:
- 获取当前进程编号
- 获取当前父进程编号
获取当前进程编号
os.getpid() 表示获取当前进程编号
# 获取当前进程(主进程)编号
main_process_id = os.getpid()
# 获取当前进程对象,查看当前代码是由哪个进程执行的
print('main_process_id:', main_process_id, multiprocessing.current_process())
# 跳舞任务
def dance():
# 获取当前进程(子进程)编号
dance_process_id = os.getpid()
# 获取当前进程对象,查看当前代码是由哪个进程执行的
print('dance_process_id:', dance_process_id, multiprocessing.current_process())
for i in range(3):
print('跳舞中...')
time.sleep(0.2)
# 唱歌任务
def sing():
# 获取当前进程(子进程)编号
sing_process_id = os.getpid()
# 获取当前进程对象,查看当前代码是由哪个进程执行的
print('sing_process_id:', sing_process_id, multiprocessing.current_process())
for i in range(3):
print('唱歌中...')
time.sleep(0.2)
获取当前父进程编号
os.getppid() 表示获取当前父进程编号
# 跳舞任务
def dance():
# 获取当前进程(子进程)编号
dance_process_id = os.getpid()
# 获取当前进程对象,查看当前代码是由哪个进程执行的
print('dance_process_id:', dance_process_id, multiprocessing.current_process())
# 获取当前进程的父进程编号
dance_process_parent_id = os.getppid()
print('dance_process的父进程编号是:', dance_process_parent_id)
for i in range(3):
print('跳舞中...')
time.sleep(0.2)
# 唱歌任务
def sing():
# 获取当前进程(子进程)编号
sing_process_id = os.getpid()
# 获取当前进程对象,查看当前代码是由哪个进程执行的
print('sing_process_id:', sing_process_id, multiprocessing.current_process())
# 获取当前进程的父进程编号
sing_process_parent_id = os.getppid()
print('sing_process的父进程编号是:', sing_process_parent_id)
for i in range(3):
print('唱歌中...')
time.sleep(0.2)
扩展:根据进程编号强制杀死指定进程
# 跳舞任务
def dance():
# 获取当前进程(子进程)编号
dance_process_id = os.getpid()
# 获取当前进程对象,查看当前代码是由哪个进程执行的
print('dance_process_id:', dance_process_id, multiprocessing.current_process())
# 获取当前进程的父进程编号
dance_process_parent_id = os.getppid()
print('dance_process的父进程编号是:', dance_process_parent_id)
for i in range(3):
print('跳舞中...')
time.sleep(0.2)
# 扩展:根据进程编号强制杀死指定进程
os.kill(dance_process_id, 9)