一、概念
进程:是操作系统进行资源分配和调度运行的基本单位,通俗理解:一个正在运行的程序就是一个进程。例如:正在运行的qq , 微信等 他们都是一个进程。
多进程:多个程序运行;
多进程存在两种运行方式,一种是“并发”,指cpu让多个程序交替轮流运行,但因运行速度太快,会误以为多个程序同时运行,是伪多进程;还有一种是“并行”,指cpu让多个程序真的同时运行。
多进程执行代码:
例:
import time,multiprocessing #导包
def sing(): #定义函数1
for i in range(5):
time.sleep(0.01)
print('想唱就唱,要唱得响亮!')
def dance(): #定义函数2
for i in range(5):
time.sleep(0.01)
print('想跳就跳,要跳得飞扬!')
'''
(window电脑的多进程必须添加main判断,否则会无限递归产生子进程,并start
因为在 Windows 上,Python 使用 spawn 方式创建进程,每个子进程都会重新导入
(import)主模块,并从头开始执行代码。)
'''
if __name__=='__main__': #main为主进程
p1=multiprocessing.Process(target=sing) #创建子进程1
p2=multiprocessing.Process(target=dance) #创建子进程2
p1.start() #子进程1运行
p2.start() #子进程2运行
二、多进程特点:1.进程之间不共享全局变量;2.主进程进程会等所有的子进程执行结束而结束;3.多进程之间是无序的。
第1和3点无法解决,但第二点一般可以通过两种方式(1.daemon函数;2.terminate函数)处理。
处理代码如下:
例:
import multiprocessing,time
def music(): #定义函数
for i in range(5):
print(f'正在播放第{i}首音乐')
if __name__=='__main__':
print(f'主进程开始,{multiprocessing.current_process().name}')
p1=multiprocessing.Process(target=music)
#第一种处理方式:p1.daemon=True ,守护主进程,主进程退出子进程直接销毁,不再执行
p1.start()
time.sleep(0.2)
# 第二种处理方式:
p1.terminate():在主进程结束前强制结束子进程
print(f'主进程结束,{multiprocessing.current_process().name}')
最后提示:
1.在创建子进程时,可以通过元组(args)或者字典(kwargs)形式向内里传参,如:sing_process = multiprocessing.Process(target=music, args=(3, ))dance_process = multiprocessing.Process(target=coding, kwargs={‘count’: 3}),只要原有函数有传参需求,就可以这样操作;
2.获取当前父进程(如果主进程直接创造子进程,则父进程也就是主进程,如果不是,那么另说)和子进程的id代码分别为:os.getppid()、os.getpdi(),有需要可查看(ppid意味是parent pid)。
注意:获取id前先导入os包。