zoukankan      html  css  js  c++  java
  • python3.x pool.map方法的实质

    我使用多进程的一般方式,都是multiprocessing模块中的Pool.map()方法。下面写一个简单的示例和解析。至于此种方法使用多进程的效率问题,还希望大佬予以指正。

    示例:

    """
    探索pool.map多进程执行方式的实质
    """
    
    from multiprocessing import Pool
    from time import sleep
    from datetime import datetime
    
    class forMap:
        def __init__(self):
            self.name = '没啥用的初始化'
    
        def forPrinit(self, i):
            sleep(i)
            print(i)
            return i ** 2

    基本的代码已经写好,下面看看怎么使用多进程去执行。

    • 执行示例1:
    if __name__ == '__main__':
        s = datetime.now()
        tt = forMap()
        # 进程池中创建两个进程,调用计算机的两个内核去帮我做事。
        p = Pool(2)
    
        l = [2, 4, 6]
        rList = p.map(tt.forTest, l)
        print(rList)
    
        p.close()
        p.join()
    
        e = datetime.now()
        print('多进程执行时间:', e - s)

    运行结果:

    2
    4
    6
    [4, 16, 36]
    多进程执行时间: 0:00:08.191251

    由于在进程池中创建了两个进程,所以代码会调用计算机的两个内核。而列表l中的三个元素中的前两个(“2”和“4”),会依次传入函数中,由计算机内核A和B去执行。当某一个内核执行完,会继续接收下一个传入参数“6”函数。而且内核A执行的函数,只会sleep两秒,所以,传入参数“6”的函数会由内核A去执行。所以A一共执行了2 + 6 为8秒,又由于是并行,所以总的执行时间是8秒(多的那零点几是初始化、赋值、打印等操作)。

    • 执行示例2:
    if __name__ == '__main__':
        s = datetime.now()
        tt = forMap()
        # 进程池中创建三个进程
        p = Pool(3)
    
        l = [2, 4, 6]
        rList = p.map(tt.forTest, l)
        print(rList)
    
        p.close()
        p.join()
    
        e = datetime.now()
        print('多进程执行时间:', e - s)

    执行结果:

    2
    4
    6
    [4, 16, 36]
    多进程执行时间: 0:00:06.273263

    创建了三个进程 ,并行执行,所以执行时间是6秒

    • 执行示例3:
    if __name__ == '__main__':
        s = datetime.now()
        tt = forMap()
        # 进程池中创建三个进程
        p = Pool(3)
    
        l = [2, 4, 6, 8]
        rList = p.map(tt.forTest, l)
        print(rList)
    
        p.close()
        p.join()
    
        e = datetime.now()
        print('多进程执行时间:', e - s)

    执行结果:

    2
    4
    6
    8
    [4, 16, 36, 64]
    多进程执行时间: 0:00:10.211451

    在列表中添加一个元素,首先内核A、B、C分别执行2, 4, 6。A先结束,所以8也会由A来执行。

    • 执行示例4:
    if __name__ == '__main__':
        s = datetime.now()
        tt = forMap()
        # 进程池中创建三个进程
        p = Pool(2)
    
        l = [2, 4, 8, 6]
        rList = p.map(tt.forTest, l)
        print(rList)
    
        p.close()
        p.join()
    
        e = datetime.now()
        print('多进程执行时间:', e - s)

    执行结果:

    2
    4
    8
    6
    [4, 16, 64, 36]
    多进程执行时间: 0:00:10.200389

    还是创建两个进程,将列表中第3和第4个元素交换位置,执行结果为10秒多,而且返回值也是交换过位置之后的,说明map方法中,可迭代对象传入函数是从前到后逐个提取元素。

  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/zrmw/p/10272034.html
Copyright © 2011-2022 走看看