15多处理的简单应用
一.介绍
多处理最适合于有CPU约束任务的场景,这些任务可以划分为独立的子任务。以下是多处理可能有益的一些情况: CPU密集型计算:如果您有可以并行化的计算密集型任务,如数学计算、图像处理或模拟,多处理可以帮助在多个CPU核心之间分配工作负载,并可能减少总体执行时间。 并行处理:当您有一个大型数据集或一组可以同时处理的独立任务时,可以使用多处理在多个进程之间划分工作负载,从而实现更快的处理和改进的性能。 批处理:如果您需要处理大量文件或对一组数据执行重复任务,可以使用多处理将工作负载分布在多个进程中,从而加快执行速度并提高效率。 科学计算:许多科学计算库和框架,如NumPy、SciPy和TensorFlow,都是为了利用多处理而设计的。这些库通常提供数学运算和算法的并行实现,允许在多核系统上进行高效计算。 Web抓取或API请求:当执行Web抓取或发出多个API请求时,可以使用多处理来并行化请求,从而加快数据检索并提高效率。 需要注意的是,并非所有任务都能从多处理中受益。I/O绑定任务,如读取或写入文件、发出网络请求或与数据库交互,可能不会从多处理中看到显著的性能改进,因为它们主要受到I/O操作速度而非CPU处理能力的限制。 此外,还应考虑进程创建和进程间通信的开销。如果开销超过了并行化的好处,那么多处理可能不是最有效的方法。 在实现多处理之前,建议对代码进行评测和基准测试,以确定任务是否适合并行化,并评估潜在的性能提升。 总的来说使用场景:就是把任务可以划分为独立的子任务,并行处理可以提升效率的。 不建议使用场景:大量I/O绑定任务或涉及大量进程间通信的任务,不建议使用多处理,进程通信会消耗大量资源,而io密集任务会让进程在等待执行,当创建 大量时会导致系统资源大量耗尽。
二.代码实现
# -*- coding:utf-8 -*- from multiprocessing import Process import time import os #两个子进程将会调用的两个方法 def child_1(interval): print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid())) t_start = time.time() # 计时开始 time.sleep(interval) # 程序将会被挂起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) # 程序将会被挂起interval秒 t_end = time.time() # 计时结束 print("子进程(%s)执行时间为'%0.2f'秒"%(os.getpid(),t_end - t_start)) if __name__ == '__main__': print("------父进程开始执行-------") print("父进程PID:%s" % os.getpid()) # 输出当前程序的ID p1=Process(target=child_1,args=(1,)) # 实例化进程p1 p2=Process(target=child_2,name="mrsoft",args=(2,)) # 实例化进程p2 p1.start() # 启动进程p1 p2.start() # 启动进程p2 #同时父进程仍然往下执行,如果p2进程还在执行,将会返回True print("p1.is_alive=%s"%p1.is_alive()) print("p2.is_alive=%s"%p2.is_alive()) #输出p1和p2进程的别名和pid 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() # 等待p1进程结束 p2.join() # 等待p2进程结束 print("------父进程执行结束-------")