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("------父进程执行结束-------")

 

    

posted @ 2023-09-04 23:26  冷夜O  阅读(27)  评论(0)    收藏  举报