创建子进程的三种方式:
(一)只能在linux运行,windows不行
# import os
# os.fork()
# print(os.getpid())
(二)for 循环,创建指定个数的的子进程
from multiprocessing import Process def func(index): print("第%s封邮件已经发送" % (index)) if __name__ == '__main__': # 作为主程序运行 for i in range(10): #创建10个子进程 p = Process(target=func,args=(i,)) # args给进程函数传参,必须是元组 p.start() #开启子进程
执行结果:
第1封邮件已经发送
第0封邮件已经发送
第3封邮件已经发送
第2封邮件已经发送
第5封邮件已经发送
第4封邮件已经发送
第6封邮件已经发送
第7封邮件已经发送
第8封邮件已经发送
第9封邮件已经发送
(三)自己定义一个类,继承Process类
(1)无参
from multiprocessing import Process import os class MyProcess(Process): # 必须使用run方法,规定这样写 def run(self): print("子进程: 参数:",os.getpid(),os.getppid()) # 获取子进程id号和主进程id号 if __name__ == '__main__': MyProcess().start() print('主进程:',os.getpid())
# 执行结果:因为没有阻塞,由于cpu的自行调度,主进程运行得更快
主进程: 7068
子进程: 参数: 4376 7068
(2) 有参
import os from multiprocessing import Process class Myprocess(Process): # 自定义一个类继承父类Process def __init__(self, arg): super().__init__() # 调用父类的构造方法 self.arg = arg def run(self): # 自动调用run方法 print("子进程: 参数:", os.getpid(), os.getppid(), self.arg) if __name__ == '__main__': lis = [] for i in range(10): p = Myprocess('参数%s' % (i)) p.start() lis.append(p) for p in lis: p.join() # 添加阻塞,让子进程先执行完,主程序最后执行 print("主进程", os.getpid())
执行结果:
子进程: 参数: 6808 6548 参数1 子进程: 参数: 7088 6548 参数0 子进程: 参数: 6940 6548 参数3 子进程: 参数: 2220 6548 参数5 子进程: 参数: 6580 6548 参数2 子进程: 参数: 6488 6548 参数4 子进程: 参数: 6828 6548 参数6 子进程: 参数: 6620 6548 参数7 子进程: 参数: 1844 6548 参数8 子进程: 参数: 6736 6548 参数9 主进程 6548