前言:众所周知,在当前的计算机中我们可以让其一次性去执行一个乃至多个程序,程序运行时就是计算机对其资源的分配,也就是一个进程,那么进程到底是什么呢?下面本博主就自己的一些理解来与大家分享分享..
进程:
1.进程的概念:
一个正在运行的程序或软件就是一个进程,进程是操作系统进行资源分配的最基本单位,启动一个软件,系统分配一定的内存,进程就是一个程序在一个数据集上的一次动态执行过程。进程一般是由程序、数据集、进程控制块三部分组成的。
2.进程分类:
进程又分为单进程和多进程两种形式:
(1).单进程:
单进程:默认程序开启时创建一个进程,咱们所写的一个 py 文件就是一个进程,系统会分配资源开启一个进程去处理这个 py 文件,主线程去执行这个文件
(2).多进程:
完成多任务,每一个进程各自执行各自的任务,各自互不干扰各干各的事儿,本文章主要讲多进程
3.multiprocessing 模块:
提起多进程,大家肯定会想到multiprocessing
这个模块,是多进程编程必需的模块,multiprocessing
是一个用与 threading
模块相似 API 的支持产生进程的包, multiprocessing
包同时提供本地和远程并发,使用子进程代替线程
4.Process 类:
在 multiprocessing
中,通过创建一个 Process
对象然后调用它的 start()
方法来生成进程简单的来了解一下Process
:
(1).一般格式:
multiprocessing.Process(group=None,target=self,name=self,args=(self,),kwargs={})
(2).Process 参数:
(3).Process 创建实例对象:
start():启动子进程实例,也就是创建一个子进程;
join():等待主进程执行结束,监测主进程完成后,从而再去执行子进程;
terminate():不管任务是否完成,立即终止子进程.
1.start():
举例:
import multiprocessing #导包,必需
import time #导入时间包,监测进程运行时常,并且给予其一定的休息时间
def run(name):
print(time.time())
for _ in range(5):
print(f"我叫{name}在跑步")
time.sleep(1)
print("我执行完毕啦")
def sing(name):
print(time.time())
for _ in range(5):
print(f"我叫{name}我在唱歌")
time.sleep(1)
print("我执行完毕啦")
run_process=multiprocessing.Process(group=None,target=run,name=None,args=("张三",))
sing_process=multiprocessing.Process(group=None,target=sing,kwargs={"name":"李四"})
if __name__ == '__main__':
"""进行创建进程"""
run_process.start()
# run_process.terminate()
# run_process.join()
sing_process.start()
# sing_process.terminate()
复制代码
结果:
2.join():
关于join()
方法的使用必须在需要join()
对象开启后使用,它的通俗含义就是,只有我完成了才能轮到你,我没结束你就不能执行,一直等着去截取上面部分重要运行代码:
run_process=multiprocessing.Process(group=None,target=run,name=None,args=("张三",))
sing_process=multiprocessing.Process(group=None,target=sing,kwargs={"name":"李四"})
if __name__ == '__main__':
# print(os.getpid())
run_process.start()
# sing_process.daemon=True #子进程被主进程保护
# run_process.terminate()
# os.kill(os.getppid(),9)
run_process.join()
sing_process.start()
# sing_process.terminate()
# print(multiprocessing.current_process())
复制代码
那么它的运行结果可想而知,只有当run
进程执行完之后,sing
进程才会执行:
3.terminate():
terminate()
的意思就是强制结束进程,不论你是否在执行是否完成,统一给你就结束了:
run_process=multiprocessing.Process(group=None,target=run,name=None,args=("张三",))
sing_process=multiprocessing.Process(group=None,target=sing,kwargs={"name":"李四"})
if __name__ == '__main__':
# print(os.getpid())
run_process.start()
# sing_process.daemon=True #子进程被主进程保护
run_process.terminate()
# os.kill(os.getppid(),9)
# run_process.join()
sing_process.start()
# sing_process.terminate()
# print(multiprocessing.current_process())
复制代码
由结果可以看出,在进程run
刚开启时,对其使用terminate()
方法,它直接被终止运行,这就是terminate()
.
(4).常用属性:
name:当前进程别名,默认为 Process-N,N 为从 1 开始的递增整数,那么到底是什么意思呢?咱们一起来看看:
run_process=multiprocessing.Process(group=None,target=run,name="张三",args=("张三",))
sing_process=multiprocessing.Process(group=None,target=sing,name="李四",kwargs={"name":"李四"})
if __name__ == '__main__':
# print(os.getpid())
run_process.start()
print(run_process.name)
# sing_process.daemon=True #子进程被主进程保护
# run_process.terminate()
# os.kill(os.getppid(),9)
# run_process.join()
sing_process.start()
print(sing_process.name)
# sing_process.terminate()
# print(multiprocessing.current_process())
复制代码
进程的名称,这个名称是一个字符串,仅用于识别目的。它没有语义。可以为多个进程指定相同的名称。
5.获取进程编号:
获取进程编号需要导入一个我们比较熟悉的包,os
在文件进行操作时,也用到过这个包
(1).作用:
进程编号就是进程在运行时,系统给予,便于验证主子进程之间的关系,得知子进程由哪个主进程创建;
(2).方式:
获取当前进程:os.getpid()
获取父进程:os.getppid()
def run(name):
print(f"run:{os.getpid()}")
print(time.time())
for _ in range(5):
print(f"我叫{name}在跑步")
time.sleep(1)
print("我执行完毕啦")
def sing(name):
print(f"sing:{os.getppid()}")
print(time.time())
for _ in range(4):
print(f"我叫{name}我在唱歌")
time.sleep(2)
print("我执行完毕啦")
复制代码
6.进程特性;
进程之间不共享全局变量一个进程修改了全局变量,其他进程不受影响,每个进程拿到的都是初始的全局变量,全局变量在进程之间相互独立存在,之间没有任何的关系。
import multiprocessing
num = 0
def work1():
for i in range(10):
global num #用于修改全局变量
num += i
print(f"我最终的结果是:{num}")
def work2():
print(f"结果是:{num}")
work1_process = multiprocessing.Process(target=work1)
work2_process = multiprocessing.Process(target=work2)
if __name__ == '__main__':
work1_process.start()
work2_process.start()
复制代码
由上结果可见,当进程work1
修改了全局白能量,但是work2
拿到的依旧是初始的全局变量
主进程会等所有子进程结束之后再结束在主进程结束之前,手动结束子进程,那么程序结束由主进程来进行决定,那么手动结束子进程有两种方式:
1.在主进程结束前,保证所有子进程结束使用:terminate()
2.在子进程开启前,设置子进程被主进程所守护(deamon),那么主进程结束,子进程也就随即结束第一种方法前文已经提到过,那么看**第二种(deamon)**方法
import multiprocessing
num = 0
def work1():
for i in range(10):
global num
num += i
print(f"我最终的结果是:{num}")
def work2():
print(f"结果是:{num}")
work1_process = multiprocessing.Process(target=work1)
work2_process = multiprocessing.Process(target=work2)
if __name__ == '__main__':
work1_process.start()
work2_process.daemon=True
work2_process.start()
复制代码
注意哦:deamon
为bool
类型哦
评论