python: multiprocessing多进程并行计算

简介

多进程 vs 多线程 CPU密集型用多进程;IO密集型用多线程。

实例1

在科学计算中使用multiprocessing进行多进程并行计算。

    前提:多个方法func1,func2,…,funcN是相互独立的,可以并行计算。 当每个func的运行时间都较长时,利用多进程并行计算才会极大提高运行效率。原因:使用多进程本身会有一定的时间开销。

实例代码 注意:通过sleep(t)来模拟控制func运行消耗的时间

def func1(x):
    print(f当前进程:{os.getpid()},计算func1中......)
    time.sleep(5)
    return x**2

def func2(x):
    print(f当前进程:{os.getpid()},计算func2中......)
    time.sleep(5)
    return x**3
    
def test1():
    """单进程计算
    """
    print(方法1:单进程计算)
    print(f当前主进程:{os.getpid()})
    start = time.time()
    a = func1(2)
    b = func2(2)
    c = a + b
    end = time.time()
    t = end - start
    print(c=, c)
    print(f计算完成,共用时:{t:.2f}s)


def test2():
    """利用multiprocessing实现多进程计算
    """
    print(方法2:多进程计算)
    print(f当前主进程:{os.getpid()})
    start = time.time()
    pool = Pool()
    result1 = pool.apply_async(func1, args=(2, ))
    result2 = pool.apply_async(func2, args=(2, ))
    pool.close()
    pool.join()
    a = result1.get()
    b = result2.get()
    c = a + b
    end = time.time()
    t = end - start
    print(c=, c)
    print(f计算完成,共用时:{t:.2f}s)
    
if __name__ == "__main__":
    test1()
    test2()

结果及分析

    方法1计算过程中始终在同一个进程;方法2开始的进程与方法1相同,因为都是从main()入口进去的。然后计算func1和func2时,就分别开了两个新进程。符合预期。 多进程计算确实提高了运行效率,时间缩短了近3s; 理论上func1和func2并行计算,需要5s。实际有7s多,说明使用多进程是有一定固定开销的。因此,单个func运行时间越多,多进程计算节省时间也越多。调节sleep时间,可证实这一结论。
方法1:单进程计算
当前主进程:15316
当前进程:15316,计算func1中......
当前进程:15316,计算func2中......
c= 12
计算完成,共用时:10.00s

方法2:多进程计算
当前主进程:15316
当前进程:14996,计算func1中......
当前进程:16708,计算func2中......
c= 12
计算完成,共用时:7.17s
经验分享 程序员 微信小程序 职场和发展