多任务的概念:多任务(Multitasking)是指在同一时间内执行多个任务或者进程的能力。在操作系统中,多任务可以分为两种类型:基于进程的多任务和基于线程的多任务。例如电脑同时运行 QQ与微信程序。
基于进程的多任务:基于进程的多任务指的是操作系统能够同时运行多个进程,并可以为每个进程分配独立的资源,如CPU、内存等。每个进程有自己独立的地址空间和资源,彼此之间没有任何直接联系。在计算机系统中,同时运行多个进程可以使系统的效率大大提高。
多任务的执行方式
并发:单个CPU在一段时间内交替去执行任务
并行:对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。
进程的介绍:在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。
进程的概念:一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。
注意:一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。
导入进程包
import multiprocessing
创建进程与参数传递(multiprocessing.Process())
def login(name,password):
return
# 以元组方式给执行任务传参
p1 = multiprocessing.Process(target=login,args=('python',11111),name='p1')
# 以字典方式给执行任务传参
p2 = multiprocessing.Process(target=login, kwargs={'name': 'itcast', 'password': 22222222}, name='p3')
Process进程创建——说明
格式:Process(group,target,name,args,kwargs)
group:指定进程组,目前只能使用None
target:执行的目标任务名(方法名或者函数名)
name:给进程起的名字,默认是Process-1
参数传递:
args:以元组方式给执行任务传参,一定要和任务参数的顺序保持一致。
kwargs: 以字典方式给执行任务传参,传参字典中的key一定要和参数名保持一致
进程常用方法:
start():启动子进程实例
join():等待子进程执行结束
terminate():不管任务是否完成,立即终止子进程
os.getpid():获取当前进程编号
os.getppid():获取当前父进程编号
# 如果需要进程同步按照循序执行,需要用到进程等待join方法
p1.start() #运行进程
p1.join() # 等待进程p1执行完成后再执行其他的进程
# 获取当前进程名称
print('当前进程名称:',multiprocessing.current_process().name)
# 获取当前进程编号(主进程与子进程皆可)
print('当前进程:', os.getpid())
# 获取主进程编号(子进程中使用)
print('子进程的父进程编号:', os.getppid())
多进程完整代码实例:
# 导入多进程模块
import multiprocessing
import os
def login(name,password):
print('用户名:',name)
print('密码:', password)
# 获取当前进程名称
print('进程名称:',multiprocessing.current_process().name)
# 获取当前进程编号
print('子进程:', os.getpid())
# 获取主进程编号
print('子进程的父进程编号:', os.getppid())
if __name__== '__main__':
# 创建进程(不同参数传递方式)
p1 = multiprocessing.Process(target=login,args=('python',11111111),name='p1')
p2 = multiprocessing.Process(target=login,kwargs={'name':'itcast','password':22222222},name='p2')
p3 = multiprocessing.Process(target=login, kwargs={'name': 'itcast', 'password': 22222222}, name='p3')
# 运行进程指定对应函数业务逻辑
# 如果需要进程同步按照循序执行,需要用到进程等待join方法
p1.start() #运行进程
# 等待进程p1执行完成后在执行其他的进程
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
# 获取当前进程编号
print('主进程:',os.getpid())
第一种设置守护进程 daemon=True
p1 = multiprocessing.Process(target=write_data,daemon=True)
# 或者
p1.daemon = True
第二种 主动关闭子进程
# 第二种 主动关闭子进程
p2.terminate()