多进程的三种实现方式
一、多进程的创建方式
1、通过multiprocessing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #encoding='utf-8' from multiprocessing import Process import os import time '' ' os.getpid() 获取一个进程的pid 返回当前进程的pid os.getppid() 获取父进程的pid 返回父进程的pid '' ' '' ' Process类的实例常用的属性和方法有: name : 当前进程的实例别名,默认为Process-N ,N为从1开始递增的整数 pid: 当前进程实例的pid is_alive(): 判断进程实例是否还在执行 join ([timeout]): 是否等待进程实例执行结束,或等待多少秒 start(): 启动进程实例(创建子进程) run(): 如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法 terminate(): 不管任务是否完成,立即终止 '' ' def child_1(interval): print( "子进程(%s)开始执行,父进程为(%s)" %(os.getpid(),os.getppid())) t_start = time.time() time.sleep(interval) t_end = time.time() print( "子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(),t_end-t_start)) def child_2(interval): print( "子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid())) t_start = time.time() time.sleep(interval) t_end = time.time() print( "子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), t_end - t_start)) if __name__ == '__main__' : print( "----父进程开始执行----" ) print( "父进程PID:%s" % os.getpid()) p1 = Process(target=child_1,args=(1,)) p2 = Process(target=child_1,name= "test" ,args=(2,)) p1.start() p2.start() print( "p1.is_alive = %s" % p1.is_alive()) print( "p2.is_alive = %s" % p2.is_alive()) print( "p1.name = %s" % p1.name) print( "p1.pid = %s" % p1.pid) print( "p2.name = %s" % p2.name) print( "p2.pid = %s" % p2.pid) print( "----等待子进程----" ) p1. join () p2. join () print( "----父进程结束---" ) |
2、继承Process
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #encoding=utf-8 from multiprocessing import Process import time import os class SubProcess(Process): def __init__(self, interval, name= '' ): Process.__init__(self) # 调用父类的初始化方法 self.interval = interval if name: self.name = name # 重写 run() 方法 def run(self): print( "子进程 (%s) 开始执行,父进程为 (%s)" % (os.getpid(), os.getppid())) t_start = time.time() time.sleep(self.interval) t_end = time.time() print( "子进程 (%s) 执行结束,耗时%0.2f秒" % (os.getpid(), t_end - t_start)) if __name__ == '__main__' : print( "---父进程开始执行---" ) print( "父进程 PID: %s" % os.getpid()) p1 = SubProcess(interval=1, name= 'test' ) p2 = SubProcess(interval=2) p1.start() # 对一个不包含 target 属性的 Process 类执行 start() 方法,就会运行这个类中的 run() 方法 p2.start() print( "p1.is_alive = %s" % p1.is_alive()) print( "p2.is_alive = %s" % p2.is_alive()) print( "p1.name = %s" % p1.name) print( "p1.pid = %s" % p1.pid) print( "p2.name = %s" % p2.name) print( "p2.pid = %s" % p2.pid) print( "---等待子进程---" ) p1. join () p2. join () print( "---父进程执行结束---" ) |
3、使用进程池 Pool 创建进程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #encoding=utf-8 from multiprocessing import Pool import time import os '' ' Pool常用方法 apply_async(func[, args[, kwds]]) : 使用非阻塞方式调用 func 函数(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程), args 为传递给 func 的参数列表, kwds 为传递给 func 的关键字参数列表 apply(func[, args[, kwds]]): 使用阻塞方式调用 func 函数 close() : 关闭 Pool,使其不再接受新的任务 terminate(): 不管任务是否完成,立即终止 join (): 主进程阻塞,等待子进程的退出,必须在 close 或 terminate 之后使用 '' ' def task(name): print( "子进程 (%s) 开始执行 task %s..." % (os.getpid(), name)) time.sleep(1) # 休眠 1 秒 if __name__ == '__main__' : print( "---父进程开始执行---" ) print( "父进程 PID: %s" % os.getpid()) p = Pool(3) # 定义一个进程池,最大进程数为 3 for i in range(10): p.apply_async(task, args=(i,)) # 使用非阻塞方式调用 task() 函数 print( "等待所有子进程结束" ) p.close() p. join () print( "---父进程执行结束---" ) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
· C# 深度学习框架 TorchSharp 原生训练模型和图像识别
· 这或许是全网最全的 DeepSeek 使用指南,95% 的人都不知道的使用技巧(建议收藏)
· 拒绝繁忙!免费使用 deepseek-r1:671B 参数满血模型
· 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)
· Sdcb Chats 重磅更新:深度集成 DeepSeek-R1,思维链让 AI 更透明!
· DeepSeek-R1本地部署如何选择适合你的版本?看这里