多任务:指在同一时间执行多个任务
多任务的最大好处:充分利用CPU资源,提高程序的执行效率
多任务的表现形式:
1.并发(任务数量大于CPU的核心数):在一段时间内交替去执行多个任务
单核CPU执行多任务,操作系统轮流让各个任务交替执行
2.并行(任务数量小于等于CPU的核心数):在一段时间内真正地同时执行多个任务
多进程
进程:进程是资源分配的最小单位,是操作系统进行资源分配和调度运行的基本单位(一个运行起来的任务至少有一个进程)
进程的创建步骤:
1.导入进程包
import multiprocessing
2.通过进程类创建进程对象
进程对象=multiprocessing.Process()
有三个参数:target:指定目标任务名(函数名)
name,进程名,一般不用设置
group,进程组,目前只能使用None
3.启动进程执行任务
进程对象.start()
import time
import multiprocessing
def test_A():
for i in range(3):
print("任务A")
time.sleep(0.5)
def test_B():
for i in range(3):
print("任务B")
time.sleep(0.5)
if __name__ == '__main__':
process2 = multiprocessing.Process(target=test_B)
#注意这里的函数不能带括号
进程执行带有参数的任务
args:以元组的形式传递参数
kwargs:以字典的形式传递参数
import time
import multiprocessing
def test_A(number,name):
for i in range(number):
print("任务A")
print(name)
time.sleep(0.5)
def test_B(number,name):
for i in range(number):
print("任务B")
print(name)
time.sleep(0.5)
if __name__ == '__main__':
process2 = multiprocessing.Process(target=test_B,args=(3,"小于"))#注意这里的函数不能带括号
process1 = multiprocessing.Process(target=test_A,kwargs={'number':3,"name":"小于"})
process2.start()
process1.start()
获取进程编号
进程编号的作用:方便进行进程管理
获取进程编号的两种方式:
1.获取当前进程的编号
os.getpid()
2.获取当前父进程的编号
os.getppid()
在程序启动时,系统会自动分配给程序一个主进程,定义的进程都是由这个主进程定义的,所以这两个子进程的父进程编号应相同。
import time
import multiprocessing
import os
def test_A(number,name):
print("任务A的进程编号:",os.getpid())
print("任务A的父进程编号:", os.getppid())
for i in range(number):
print("任务A")
print(name)
time.sleep(0.5)
def test_B(number,name):
print("任务B的进程编号:", os.getpid())
print("任务B的父进程编号:",os.getppid())
for i in range(number):
print("任务B")
print(name)
time.sleep(0.5)
if __name__ == '__main__':
process2 = multiprocessing.Process(target=test_B,args=(3,"小于"))#注意这里的函数不能带括号
process1 = multiprocessing.Process(target=test_A,kwargs={'number':3,"name":"小于"})
process2.start()
process1.start()
进程的注意点:
1.主进程会等待所有的子进程执行结束后再结束
import time
import multiprocessing
import os
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.设置守护主进程(主进程一旦结束,子进程也随之结束)
import time
import multiprocessing
import os
def work():
for i in range(10):
print("工作中")
time.sleep(0.2)
if __name__ == '__main__':
work_process=multiprocessing.Process(target=work)
work_process.daemon=True#一旦主进程结束,子进程也会销毁
work_process.start()
#主进程睡眠一秒
time.sleep(1)
print("主进程执行完毕")