我开始写文章的时间是2021/3/8 22:28 打算分为两节,一个是多任务的进程,一个是多任务的线程
今天把多任务学完了,原来程序执行是在一个主进程里面执行主线程,所以跑一些程序光用一个进程或者线程完全是在浪费我的电脑配置呀!
前面的话就不过多赘述了,开始记录一下我学习分享,如果有问题欢迎大佬指出我的错误或着我错误的理解,谢谢!!!
为什么要有多任务?
顾名思义,多任务,并行模式或者并发模式你要执行你要执行的代码,通俗来说就是你写的多个任务一起运行。如果按照正常代码运行过程的话,由上到下执行,上面的语句没有执行完,下面的语句就不会执行,所以就导致你写的两个任务,只能从上到下,第一个任务跑完才能开始跑第二个任务。
这样做的好处是什么呢?
这样的操作能够充分利用CPU资源,提高程序运行效率
可以通俗来说,进程就是一个向内存请求开辟一片空间,操作系统分配给进程一定的运行资源(内存资源)一般来说,一个程序运行里面至少一个进程,一个进程里面至少一个线程,没有进程就没有线程,就好像进程是线程的父亲
ps:进程是操作空间分配资源的基本单位
多进程使用的模块是 multiprocessing 使用前一定要import导入模块
Process进程类的说明
Process([group [, target [, name [, args [, kwargs]]]]])
group:指定进程组,目前只能使用None
target:执行的目标任务名
name:进程名字(一般来说没有特殊要求不用设置,有默认递增值)
args:以元组方式给执行任务传参
kwargs:以字典方式给执行任务传参
Process创建的实例对象的常用方法:
start():启动子进程实例(创建子进程)
join():等待子进程执行结束
terminate():不管任务是否完成,立即终止子进程
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
来让我们尝试一下试试代码吧!(听说你尝试99次的时候,会先print:唱歌中…)
import multiprocessing
import time
# 跳舞任务
def dance():
for i in range(5):
print("跳舞中...")
time.sleep(0.2)
# 唱歌任务
def sing():
for i in range(5):
print("唱歌中...")
time.sleep(0.2)
if __name__ == '__main__':
# 创建跳舞的子进程
# group: 表示进程组,目前只能使用None
# target: 表示执行的目标任务名(函数名、方法名)
# name: 进程名称, 默认是Process-1, .....
dance_process = multiprocessing.Process(target=dance, name="myprocess1")
sing_process = multiprocessing.Process(target=sing)
# 启动子进程执行对应的任务
dance_process.start()
sing_process.start()
我把关键语句列出来,重点学习!
1.导入进程包
import multiprocessing
2.创建子进程并指定执行的任务
sub_process = multiprocessing.Process (target=任务名)
3.启动进程执行任务
sub_process.start()
1.获取进程编号的目的:
就是为了方便得知主进程和子进程的关系
获得进程编号可以查看父子进程关系
获取进程编号的目的是验证主进程和子进程的关系,可以得知子进程是由那个主进程创建出来的。
获取进程编号的两种操作
1.获取当前进程编号
os.getpid() 获得当前进程的编号(因为有os,记得要import os 模块)
·获取当前父进程编号
os.getppip() 获得此进程父进程的编号(同理,记得导入os)
目前来说,主进程一般都是main,在main中创建子进程
Process类执行任务并给任务传参数有两种方式:
args 表示以元组的方式给执行任务传参
multiprocessing.Process(target=task, args=(5,))
kwargs 表示以字典方式给执行任务传参
multiprocessing.Process(target=task, kwargs={‘key’:‘values’})
ps:前面的函数task 记得创建的时候要设置形参,不然会报错!
进程的注意点介绍:
·进程之间不共享全局变量
·主进程会等待所有的子进程执行结束再结束
·进程之间不共享全局变量
大概就是上图的意思,虽然每个进程里面都有my_list 这个列表,但是这个列表存储在内存不同的位置,所以不同的进程操作不同位置的 my_list 列表。
对于主进程会等待子进程结束而结束,具体修改方法是,子线程创建时设置主线程守护方法,或者在子线程最后加上销毁子线程方法。具体操作进行百度,本文不再过多赘述。
如果您觉得我写的还可以的话,就请您点赞,评论,关注,您的一个小小的点赞和评论,就是我坚持写下去的动力,最后,感谢您的支持!!!