【问题标题】:multiprocessing.pool.map_async does not run my functionmultiprocessing.pool.map_async 不运行我的功能
【发布时间】:2017-01-04 13:18:12
【问题描述】:

我正在尝试同时在多个内核上运行一组相同的进程。这是我的代码的简化版本。 似乎map_async 从未调用过我的函数,另外,代码被卡住了(就在print (4) 之后)。 有什么想法吗?

import multiprocessing
pairs =  [['a','b'],['c','d'],['e','f'],['g','h']]

def printPairs(first, second):
    print('pairs =', pairs)

def parallel(function, pairs):
    cpu_no = multiprocessing.cpu_count()   
    if len(pairs) < cpu_no:
        cpu_no = len(pairs)

    p = multiprocessing.Pool(cpu_no) 
    p.map_async(function, pairs, chunksize=1)
    print('3, p = ', p)
    p.close()
    print('4')
    p.join()
    print('5')    
    return

parallel(printPairs, pairs)

【问题讨论】:

    标签: python parallel-processing python-multiprocessing


    【解决方案1】:

    使pairs 成为printPairs 的参数:

    import multiprocessing
    
    
    def printPairs(pairs):
        print('pairs =', pairs)
    
    def parallel(function, pairs):
        cpu_no = multiprocessing.cpu_count()
        if len(pairs) < cpu_no:
            cpu_no = len(pairs)
    
        p = multiprocessing.Pool(cpu_no)
        p.map_async(function, pairs, chunksize=1)
        print('3, p = ', p)
        p.close()
        print('4')
        p.join()
        print('5')
        return
    
    pairs =  [['a','b'],['c','d'],['e','f'],['g','h']]
    parallel(printPairs, pairs)
    

    它有效。

    输出:

    3, p =  <multiprocessing.pool.Pool object at 0x10169d0f0>
    4
    pairs = ['c', 'd']
    pairs = ['a', 'b']
    pairs = ['e', 'f']
    pairs = ['g', 'h']
    5
    

    【讨论】:

    • 我也试过那个。这真的很奇怪,因为它仍然无法在我的计算机中运行。它完全卡在同一点。
    • 什么 Python 版本和什么操作系统?
    • Windows 10 上的 Python 3.5.1(使用 Anaconda 4.0.0)。
    • 我遇到了同样的问题。 mapstarmap 有效,但 _async 变体无效
    【解决方案2】:

    我怀疑在 Windows 上,即使您不需要函数结果,您也需要获得它们。即使没有必要,这似乎是个好主意。

    import multiprocessing
    pairs = [['a','b'],['c','d'],['e','f'],['g','h']]
    
    def printPairs(pair):
        print('pair =', pair)
    
    def parallel(function, pairs):
        cpu_no = multiprocessing.cpu_count()
        if len(pairs) < cpu_no:
            cpu_no = len(pairs)
    
        p = multiprocessing.Pool(cpu_no)
        res = p.map_async(function, pairs, chunksize=1)
        print('3, p = ', p)
        print(res.get())
        print('4')
        p.close()
        print('5')
        p.join()
        print('6')
        return
    
    if __name__ == '__main__':
        parallel(printPairs, pairs)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多