多任务
在介绍多进程之前,我们首先来介绍一下什么是多任务
在我们的计算机当中很多时候都用到了多任务
比如说我现在想下载多个文件,就像百度网盘下载文件,
我们开启下载多个文件,他就开启了多个任务,它的优势就在于充分利用了cpu资源,提高程序的执行效率
这就是多任务的一个概念
也就是说,我们可以打开百度,同时打开ppt,打开excel,可以开着QQ,聊着微信都没有问题
那么我在程序当中想要实现多任务怎么办?
在python当中,我们可以使用多进程
多进程
那么什么是进程呢?
(进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位)
简单来说就是:一个正在运行的程序就是一个进程,例如:正在运行的qq,微信等等,他们都是一个进程
这里面的重点在于运行的程序才叫进程,那么一个没有运行的程序呢,我们就叫它程序
举个例子啊,这里有个qq程序,它的大小是60k,它里面存有代码,这是一个程序,
那么我们双击运行的时候呢,他就有了进程,我们在任务管理器中就能看到
一个运行起来的程序呢,可以有至少一个进程,也就是说他也可以有多个进程
举例
那么多进程的作用呢,很简单,我们来看一下这个代码
假设这是一个hello.py的程序,我们双击运行的时候,操作系统会自动创建一个进程,这个进程会自动的给我们按顺序的执行下面两个函数,
那么我们思考一下,如果我们能够让两个函数同时运行,是不是效率就大大提高了啊,那么这就是多进程
deffunc_a():
print("任务A")
deffunc_b():
print("任务B")
func_a()
func_b()
那么怎么实现的呢,我们来看一下:
当我们运行这个hello.py的时候,操作系统就会自动为它创造一个进程,这个进程我们通常称之为主进程,这是默认的,只要一个程序要运行,我们就会创建一个主进程,这个主进程会默认先执行func_a,在执行func_b,按顺序执行
那么我们这时要用多进程来实现它,怎么执行呢?还是hello.py,我们在运行的时候,会创建一个进程,叫主进程,除此之外,它还会创建一个进程,叫做子进程,此时就有两个进程了,并且我们让主进程来执行func_a,子进程来执行func_b,让他们来实现多任务,这样子效率就大大提高了
我们来介绍一下多进程的创建步骤:
首先,导入进程包,也就是多进程的模块
from multiprocessing import Process
第二步,通过进程类来导入进程对象
进程对象 = multiprocessing.Process()
multiprocessing当中有一个Process类,这个类可以创建一个进程对象
第三步,启动进程来执行指定任务
进程对象.start()
我们来一步一步剖析一下,
首先,包的导入,这个我们没什么可说的
第二步,通过进程类来创建一个进程对象
我们创建对象的时候,这个类后面我们需要添加上一些参数
进程对象 = multiprocessing.Process(target=任务名)
参数名 说明
target 执行的目标任务名,这里指的是函数名(方法名)
name 进程名,一般不用设置
group 进程组,目前只能使用None
1、最重要的参数就是target,创建对象的时候我们必须指定这个进程在启动后要执行的任务名,这个其实是比较好理解的,因为我们实现多任务的目的就是为了搞一个任务专门去分担一个程序的某一个函数,如果可以创建五个任务,那么就会同时执行五个函数,注意,target后面跟上的是函数名(方法名)
2、第二个参数是name,name是我们所创建进程的名字,name参数一般不用设置,因为我们在创建一个进程的时候,系统都会默认给进程命名为进程-1,进程-2.....
3、第三个group,叫进程组,这个我们了解一下就可以了
那么创建进程以后我们要怎样去启动它呢?
进程创建与启动进程的代码
#创建子进程
#指定一个唱歌的进程,让它去指定唱歌的函数
sing_process = multiprocessing.Process(target=sing)
#创建子进程
#指定一个跳舞的进程,让它去执行跳舞的函数
dance_process = multiprocessing.Process(target=dance)
#启动进程
sing_process.start()
dance_process.start()
那么完整的代码是什么样的呢
# 1.导入进程包
import time
from multiprocessing import Process
# 首先我们需要创建两个函数
# 唱歌
def sing():
for i in range(3): #首先进行循环输出
print("唱歌。。。")
time.sleep(0.5) #为了想要显示它一步一步打印的效果,我们可以设置延0.5秒(需要导入进程包)
#跳舞
def dance():
for i in range(3):
print("跳舞。。。")
time.sleep(0.5)
if__name__ == '__main__':
# 第一个程序我们先实现单任务:创建了一个主进程,他会先执行唱歌,再执行跳舞
# sing()
# dance()
# 2.创建进程对象
sing_process=Process(target=sing) #创建唱歌进程的时候指定一下唱歌的函数。
dance_process=Process(target=dance) #创建跳舞进程就指定跳舞函数
# 3.使用对象里面的start方法启动进程来执行指定任务
sing_process.start()
dance_process.start()
回过头来总结一下
多进程创建多任务需要的三个步骤:
1、导入进程包:
from multiprocessing import Process
2、创建子进程并指定执行的任务:
sub_process = multiprocessing.Process(target=任务名)
3、启动进程对象执行指定任务:
sub_process.start()
进程传递参数形式:
参数名 说明
args 以元组的形式给执行任务传参
kwargs 以字典的方式给执行任务传参
那么其中怎么使用呢?
args参数的传参形式(元组)
#target:进程执行的函数名
#args: 表示以元组的形式给函数传参
sing_process = multiprocessing.Process(target=sing, args=(3,))
#注意只传一个参数的话后面要加上逗号
sing_process.start()
args中写入的第一个参数就是我们函数的第一个形参,元组必须要加逗号(如果有疑问的话需要去学习一下元组的基础知识)
kwargs参数的传参方式(字典)
# target: 进程执行的函数名
# kwargs: 表示以字典的形式给函数传参
dance_process = multiprocessing.Process(target=dance, kwargs={"num": 3})
#启动进程
dance_process.start()
示例
import time
from multiprocesing import Process
def狗叫(a): # a = "啊"
forxinrange(10):
print('汪汪汪', a)
time.sleep(0.3)
def猫叫(a): # a = "哇"
for x in range(10):
print('猫猫猫', a)
time.sleep(0.3)
if__name__ == '__main__':
p1 = Process(target=狗叫, args=('啊',))
p2 = Process(target=猫叫, kwargs={'a': '哇'})
p1.start() #启动进程,并调用该子进程中的.run(),即target指定的方法
p2.start()
#1 group——参数未使用,值始终为None
#2 target——表示调用对象,即子进程要执行的任务
#3 args——表示调用对象的位置参数元组,args=(1,2,'egon',)
#4 kwargs——表示调用对象的字典,kwargs={'name':'egon','age':18}
#5 name——为子进程的名称