#导入多进程模块
import multiprocessing
import os
import time
def sing():
for i in range(5):
print("正在唱歌.....")
print(f"子进程1的名称是:{multiprocessing.current_process().name},id是:{multiprocessing.current_process().pid}")
#获取当前的进程id使用os.getpid(),获得当前进程的父进程的进程id使用os.getppid()
print(os.getpid(),os.getppid())
#暂停0.1秒,开始下一子进程
time.sleep(0.1)
def dance():
for i in range(5):
print("正在跳舞.....")
print(f"子进程2的名称是:{multiprocessing.current_process().name},id是:{multiprocessing.current_process().pid}")
print(os.getpid(), os.getppid())
time.sleep(0.1)
if __name__ == '__main__':
print(f"主进程的名称是:{multiprocessing.current_process().name},id是:{multiprocessing.current_process().pid}")
print(os.getpid(), os.getppid())
#创建一个进程p1
p1 = multiprocessing.Process(target=sing)
#创建一个进程p2
p2 = multiprocessing.Process(target=dance)
#启动进程p1
p1.start()
#启动进程p2
p2.start()
#通过添加join方法能够让p1运行完,主进程才能运行完
p1.join()
下面主要就是代码的运行结果,也可以自己尝试下p2.join(),加入到代码中,这样就可以最后执行进程start之后的主进程代码,否则主进程代码可能会先一步执行完成。
接下来开始说明子进程如何随着主进程的结束而结束呢?一般来说,提前结束子进程的常见方法有两种,一种是通过设置子进程对象的daemon = True,就是守护主进程,还一种就是将子进程进行terminate(),然后exit(),具体实现如下:
import multiprocessing
import sys
import time
def func():
for i in range(5):
print(i)
time.sleep(0.5)
print("子进程结束啦!")
if __name__ == '__main__':
#创建子进程
p1 = multiprocessing.Process(target=func)
#设置守护主进程
p1.daemon = True
p1.start()
time.sleep(1)
print(f"主进程{multiprocessing.current_process().name}结束啦!")
# #子进程随着主进程的结束而结束
# p1.terminate()
# exit()
sys.exit()
运行结果如下:
子进程没有打印完,整个程序就结束了!