目录
1 获取进程id
当我们运行py文件时,该程序的运行就是一个进程 ,如果在该进程中又创建了其他进程,那么该进程就是主进程,创建的其他进程就是子进程。
下面我们通过通过os库中的方法,打印当前进程和父进程的id来验证这一关系。
os.getpid() | 获取当前进程id |
---|---|
os.getppid() | 获取父进程id |
'''
获取进程编号,用于验证子进程是否是由主进程创建出来的
'''
import multiprocessing
import time
import os
def homework():
'''
写作业方法,每隔0.2秒写一次作业
'''
#获取当前进程(子进程)编号
homework_pro_id=os.getpid()
print('homework_pro_id:',homework_pro_id,multiprocessing.current_process())
#获取父进程编号
father_pro_id=os.getppid()
print('father_pro_id',father_pro_id)
for i in range(5):
print('doing my homework..')
time.sleep(0.2)
def singing():
'''
唱歌方法,每隔0.2秒唱一次歌
'''
# 获取当前进程(子进程)编号
sing_pro_id = os.getpid()
print('homework_pro_id:', sing_pro_id, multiprocessing.current_process())
# 获取父进程编号
father_pro_id = os.getppid()
print('father_pro_id', father_pro_id)
for i in range(5):
print('singing my favourite song! ')
time.sleep(0.2)
if __name__=='__main__':
#获取主进程编号
main_process_id=os.getpid()
#打印主进程编号,与当前进程信息
print('main_process_id :',main_process_id,multiprocessing.current_process())
# 创建写作业进程
hw_process = multiprocessing.Process(target=homework, name='homework')
# 创建唱歌进程
sing_process = multiprocessing.Process(target=singing, name='singing')
hw_process.start()
sing_process.start()
通过打印结果可以发现,主进程id(下面的mian_process_id) 是3020,与singsing、homework两个子进程的父进程id相吻合,也就验证了主进程和子进程的关系。
main_process_id : 3020 <_MainProcess(MainProcess, started)>
homework_pro_id: 17172 <Process(singing, started)>
homework_pro_id: 16820 <Process(homework, started)>
father_pro_id 3020
singing my favourite song!
father_pro_id 3020
doing my homework..
singing my favourite song!
doing my homework..
singing my favourite song! doing my homework..
singing my favourite song! doing my homework..
doing my homework..
singing my favourite song!
2 主进程会等待子进程结束
如果主进程的任务已经处理完毕,但子进程还未结束,主进程会等待子进程结束再结束。下面用一个例子来说明,我们让主进程延时0.5秒后结束,但子进程将会进行5次每次间隔0.2秒的打印再结束,通过观察打印结果来验证主进程是否等待子进程结束再结束。
import multiprocessing
import time
def do_homowork():
for i in range(5):
print('doing homework...')
time.sleep(0.2)
if __name__=='__main__':
#创建子进程,主进程会等待子进程结束再结束
process=multiprocessing.Process(target=do_homowork,name='homework')
#process.daemon=True#方法1:子进程设置为守护主进程
process.start()
time.sleep(0.5)#主进程0.5秒后结束
print('exit')
#process.terminate()#方法2:销毁子进程,使得主进程结束子进程也结束
从打印结束可以看出,主进程的确等待子进程结束才结束。
doing homework...
exit
doing homework...
doing homework...
doing homework...
doing homework...
3 守护主进程
如果我们希望主进程结束,把所有子进程也一起结束,那么有两种方法可以满足要求:(1)守护主进程(2)销毁子进程
3.1 守护主进程
操作很简单,创建子进程后,设置进程对象的daemon(守护进程)属性为True即可。
if __name__=='__main__':
#创建子进程,主进程会等待子进程结束再结束
process=multiprocessing.Process(target=do_homowork,name='homework')
process.daemon=True#方法1:子进程设置为守护主进程
process.start()
time.sleep(0.5)#主进程0.5秒后结束
print('exit')
可以看到,当主进程打印exit后,子进程没有继续再执行打印,也相应结束。
3.2 销毁子进程
销毁子进程,只需要再主进程结束后,手动通过terminate方法关闭子进程即可。
if __name__=='__main__':
#创建子进程,主进程会等待子进程结束再结束
process=multiprocessing.Process(target=do_homowork,name='homework')
process.start()
time.sleep(0.5)#主进程0.5秒后结束
print('exit')
process.terminate()#方法2:销毁子进程,使得主进程结束子进程也结束
效果与上相同。
doing homework...
exit