进程的基本介绍
在我们的操作系统中,每一个程序启动,都会有一个或者多个进程
进程是资源分配的最小单位,它是操作系统进行资源分配和调度运行的基本单位
你正在运行的谷歌浏览器,QQ,微信等等,都是一个进程,操作系统会根据你的进程来分配CPU,内存等资源
相对于单进程而言,多进程的效率会更高
多进程演示
单进程演示
多进程完成多任务
在python中,创建进程十分简单,只需三步
1.导入进程包
2.创建进程对象
3.启动进程
下面是一个多进程完成多任务的一个例子,按照上述步骤就可以
#导入进程包
import time
import multiprocessing
def coding():
for i in range(3):
print('coding...')
time.sleep(0.2)
def music():
for i in range(3):
print('music...')
time.sleep(0.2)
if __name__ == '__main__':
#创建进程对象
coding_process = multiprocessing.Process(target=coding)
music_process = multiprocessing.Process(target=music)
#启动进程
coding_process.start()
music_process.start()
运行结果如下,而且能感觉到运行效率是明显提高运行效率
创建进程对象
如果函数不需要传入参数:
multiprocessing.Process(targer=函数名)
如果函数需要传入参数:
multiprocessing.Process(targer=函数名, args = (参数1,参数2,……))
multiprocessing.Process(targer=函数名, kwargs = {参数1 : value1,参数2 : value2,……})
启动进程
Process.start()
注意:一定要start才能启动进程
带参数的多进程示例:coding函数传入num控制循环的次数,music函数传入t控制睡眠时间
import time
import multiprocessing
def coding(num):
for i in range(num):
print('coding...')
time.sleep(0.2)
def music(t):
for i in range(3):
print('music...')
time.sleep(t)
if __name__ == '__main__':
coding_process = multiprocessing.Process(target=coding,args=(3,))
music_process = multiprocessing.Process(target=music,kwargs={'t':0.2})
coding_process.start()
music_process.start()
可以自己尝试一下不同参数带来的效果
进程编号
当程序中进程数量很多时,为了更好的管理,每一个进程都有自己的编号
PID --- Process ID 子进程ID
PPID --- Parent Process ID 主进程ID
![](https://img-blog.csdnimg.cn/direct/217bdf3f2be64a38932ce2874c72fb14.png)
获取进程编号
方法1:
import os
pid = os.getpid()
1
方法2:
import multiprocessing
pid = multiprocessing.current_process().pid
下面是示例,
import time
import os
pid = os.getpid()
print(pid)
time.sleep(20)
还可以通过os.getppid()获取子进程的主进程的PPID
import time
import multiprocessing
import os
def coding():
print('coding....')
pid = os.getpid()
print(f'coding的PID:{pid}')
ppid = os.getppid()
print(f'coding的PPID:{ppid}')
if __name__ == '__main__':
print(f'当前主进程pid:{os.getpid()}')
coidng_process = multiprocessing.Process(target=coding)
coidng_process.start()
可以看到,上面coding的PPID恰好是这个程序的PID,这就说明了coding_Process正是主进程创建的子进程
杀死进程
os.kill(PID, signal),signal可以是9 、15
9 -- 代表强制杀死进程
15 -- 代表正常杀死进程
很简单就不演示了,只要获取到进程PID就可以结束进程
注意事项
1.进程之间是不共享全局变量的
创建一个子进程,起始就是把主进程的资源复制一份给子进程,两个进程是独立的,创建子进程后,子进程也会拷贝到一个与主进程的全局变量同样名字的变量,但其实两者是完全独立的,只是恰好同名而已
2.主进程不会等待所以子进程结束后再结束
这就有可能出现一种情况:主进程结束了,但子进程还没有结束,还在运行
这显然是不合理的,按常理来说,子进程依赖于主进程中,当主进程结束后,子进程也应该结束
为了防止出现这种问题,有以下两个方案:
方案一:设置守护进程
在创建子进程后,进行相关设置,主进程退出后,不再执行子进程中的代码
process.daemon = True
方案二:销毁子进程
在主进程结束之前,手动销毁子进程
process.terminate()