【问题标题】:multiprocessing freeze computer多处理冻结计算机
【发布时间】:2017-02-14 23:53:38
【问题描述】:

我通过使用多处理提高了执行时间,但我不确定 PC 的行为是否正确,它会冻结系统直到所有进程完成。 我正在使用 Windows 7 和 Python 2.7。

也许我做错了,这就是我所做的:

def do_big_calculation(sub_list, b, c):
    # do some calculations here with the sub_list

if __name__ == '__main__':
    list = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
    jobs = []
    for sub_l in list :
        j = multiprocessing.Process(target=do_big_calculation, args=(sub_l, b, c))
        jobs.append(j)
    for j in jobs:
        j.start()

【问题讨论】:

    标签: python windows python-multiprocessing


    【解决方案1】:

    在这里,您为每个任务创建 1 个Process。这将并行运行您的所有任务,但它会给您的计算机带来沉重的开销,因为您的调度程序需要管理许多进程。这可能会导致系统冻结,因为您的程序使用了太多资源。

    这里的解决方案可能是使用multiprocessing.Pool 来运行给定数量的进程同时执行某些任务:

    import multiprocessing as mp
    
    def do_big_calculation(args):
        sub_list, b, c = args
        return 1
    
    if __name__ == '__main__':
        b, c = 1, 1
        ll = [([1, 2, 3, 4], b, c),
              ([5, 6, 7, 8], b, c),
              ([9, 10, 11, 12], b, c)]
        pool = mp.Pool(4)
        result = pool.map(do_big_calculation, ll)
        pool.terminate()
        print(result)
    

    如果你准备好使用第三方库,你也可以看看concurrent.futures(你需要在python2.7中安装它,但它存在于python3.4+)或joblib(可用于pip ):

    from joblib import Parallel, delayed
    
    def do_big_calculation(sub_list, b, c):
        return 1
    
    if __name__ == '__main__':
        b, c = 1, 1
        ll = [([1, 2, 3, 4], b, c),
              ([5, 6, 7, 8], b, c),
              ([9, 10, 11, 12], b, c)]
        result = Parallel(n_jobs=-1)(
            delayed(do_big_calculation)(l, b, c) for l in ll)
        print(result)
    

    这种库的主要优点是它正在开发,而 python2.7 中的multiprocessing 被冻结。因此,错误修复和改进相对频繁。
    它还实现了一些巧妙的工具来减少计算的开销。例如,它对大型 numpy 数组使用内存映射(减少启动所有作业的内存占用)。

    【讨论】:

    • 我测试了一夜,效果非常好!使用第三方库有什么好处吗?
    • joblib 包括一些巧妙的作业调度和一些使用内存映射的大型 numpy 数组的优化共享。这样可以减少进程管理带来的开销。 multiprocessing.Pool 有一些错误,使它有点麻烦(尤其是对于跨平台项目),但对于基本的多处理,它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 2019-11-16
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2010-12-08
    • 2016-11-04
    相关资源
    最近更新 更多