三.多任务编程
1. 计算机任务执行
·CPU:中央处理器(central processing unit ,简称CPU),用于任务执行运算,主流架构形式有因特尔的X86跟ARM,ARM主要用于移动端。
·操作系统调用CPU执行任务
应用程序 | 应用程序 | 应用程序 | 应用程序 |
👇
操作系统 |
👇
CPu/ 内存/ 硬件等 |
·CPU轮询:cpu在多个任务之间快速的切换执行,因为切换的速度在微妙级别,所以看起来就像同时在执行多个任务。
(1)一个cpu核心同一时刻只能执行一个任务
(2)多核心CPU可以理解为多个单核心CPU的集合
·并发与并行
并发:多个任务同时分配给一个CPU核心切换执行,这种情况就是并发,但是多个任务并真正的同时执行。
并行:多个任务同时分配给不同的CPU核心,同时执行,这种情况是并行,并行是多个任务真正的同时执行。
2. 什么是多任务编程?
·多任务编程: 在一个程序中编写多个任务,在程序运行中让多个任务同时执行。
·实现方法:多进程编程,多线程编程
·多任务编程好处:1)提高程序任务之间的配合、
2)充分利用计算机资源,提高了程序任务执行效率
3.进程Process
·程序是一个可执行文件,静态的存放在磁盘
·进程是一个动态的过程描述,会占有计算机运行资源,有自己的生命周期
进程三态 就绪:进程具备执行条件,等待系统调度分配资源
运行:进程占用CPu执行
执行:进程阻塞等待,让出CPU资源
主要类跟函数使用
Process:创建进程对象
target:绑定执行的目标函数
args(元组):给target函数位置传参
kwargs(字典):给target函数值传参
start():启动进程
使用进程
模块:multiprocessing
创建步骤:
1.将需要新进程执行的事件封装成函数
2.通过模块的Process类创建进程对象,关联函数
3.通过进程对象设置进程信息与属性
4.通过进程对象调用start启动进程
5.通过进程对象调用join回收资源
无参函数
#导入模块 multiprocessing import multiprocessing from time import sleep #创建进程执行的函数 def fun(): print('子进程函数开始执行···') #睡眠模拟程序执行 sleep(2) print('子进程函数执行完成···') #Windows系统下 必须把子进程相关代码放入IF Linux不需要 if__name__=='main__': #创建子进程对象 p=multiprocessing.Process(target=fun) #启动子进程,进程诞生并执行fun函数 p.start() #主进程执行模拟 print('主进程开始执行···') sleep(3) print('主进程执行完成···') #回收 p.join()
函数传参
#导入模块 multiprocessing import multiprocessing from time import sleep #创建包含参数的进程函数 def emp (sec,name): for i in range(3): sleep(sec) print('my name is %S'%name) if__name__=='main__': #两种传参方式,位置传参和关键字传参 #1.位置传参 p=Process (target=emp,args=(2,'xiaogui')) #执行 p.start() #回收 p.join() #2.关键字传参 p=Process (target=emp,kwargs={'name':'xiaogui','sec':4}) p.start() p.join()
from multiprocessing import Process
import time
#创建函数
def fun ():
fot i in range(3):
#打印时间
print(time.ctime())
time.sleep(2)
if__name__=='__main__':
p=Process(targe=fun)
#设置True 子进程随父进程的退出而退出
#在start前设置
p.daemon=True
p.start()
#查看进程的名字
print(p.name)
#查看进程的ID
print(p.pid)
#查看进程的存活状态
print(p.is_alive())
'''
os.getpid 获取子进程
os.getippid 获取父进程
sys.exit 退出进程
'''
from multiprocessing import Process
import time,os,sys
#创建多个函数
def fun1():
time.sleep(2)
print('看书')
print(os.getppid(),'---',os.getpid())
def fun2():
time.sleep(2)
print('听歌')
print(os.getppid(),'---',os.getpid())
def fun3():
time.sleep(2)
print('睡觉')
print(os.getppid(),'---',os.getpid())
if __name__=='__main___':
#函数列表
process_list=[fun1,fun2,fun3]
#回收列表
jobs=[]
#循环执行多个进程
for fun in process_list:
p=Process(target=fun)
jobs.append(p)
p.start
#循环回收
for i in jobs:
i.join()