【问题标题】:More parallel processes than available processors in pathos比可用处理器更多的并行进程
【发布时间】:2018-12-27 15:55:30
【问题描述】:

我以前可以通过这种方式运行 100 个并行进程:

from multiprocessing import Process

def run_in_parallel(some_list):
    proc = []
    for list_element in some_list:
        time.sleep(20)
        p = Process(target=main, args=(list_element,))
        p.start()
        proc.append(p)
    for p in proc:
        p.join()

run_in_parallel(some_list)

但现在我的输入有点复杂,我得到了“那个”泡菜错误。我不得不转向悲怆。

我的代码的以下最小示例运行良好,但似乎受到线程数的限制。我怎样才能让悲伤扩展到 100 个并行进程?我的cpu只有4个核心。我的进程大部分时间都处于空闲状态,但它们必须运行数天。我不介意在初始化时使用“time.sleep(20)”。

from pathos.multiprocessing import ProcessingPool as Pool

input = zip(itertools.repeat((variable1, variable2, class1), len(some_list)), some_list)

p = Pool()
p.map(main, input)

编辑: 理想情况下,我想做 p = Pool(nodes=len(some_list)),这当然行不通。

【问题讨论】:

    标签: python parallel-processing pathos


    【解决方案1】:

    我是pathos 作者。我不确定我是否正确地解释了你的问题——当你提供了一个最小的工作代码示例时,解释这个问题会更容易一些。不过……

    这是你的意思吗?

    >>> def name(x):
    ...   import multiprocess as mp
    ...   return mp.process.current_process().name
    ... 
    >>> from pathos.multiprocessing import ProcessingPool as Pool
    >>> p = Pool(ncpus=10)
    >>> p.map(name, range(10))
    ['PoolWorker-1', 'PoolWorker-2', 'PoolWorker-3', 'PoolWorker-4', 'PoolWorker-6', 'PoolWorker-5', 'PoolWorker-7', 'PoolWorker-8', 'PoolWorker-9', 'PoolWorker-10']
    >>> p.map(name, range(20))
    ['PoolWorker-1', 'PoolWorker-2', 'PoolWorker-3', 'PoolWorker-4', 'PoolWorker-6', 'PoolWorker-5', 'PoolWorker-7', 'PoolWorker-8', 'PoolWorker-9', 'PoolWorker-10', 'PoolWorker-1', 'PoolWorker-2', 'PoolWorker-3', 'PoolWorker-4', 'PoolWorker-6', 'PoolWorker-5', 'PoolWorker-7', 'PoolWorker-8', 'PoolWorker-9', 'PoolWorker-10']
    >>>
    

    然后,例如,如果您想重新配置为仅使用 4 个 cpu,您可以这样做:

    >>> p.ncpus = 4      
    >>> p.map(name, range(20))
    ['PoolWorker-11', 'PoolWorker-11', 'PoolWorker-12', 'PoolWorker-12', 'PoolWorker-13', 'PoolWorker-13', 'PoolWorker-14', 'PoolWorker-14', 'PoolWorker-11', 'PoolWorker-11', 'PoolWorker-12', 'PoolWorker-12', 'PoolWorker-13', 'PoolWorker-13', 'PoolWorker-14', 'PoolWorker-14', 'PoolWorker-11', 'PoolWorker-11', 'PoolWorker-12', 'PoolWorker-12']
    

    我担心如果您只有 4 个内核,但想要 100 路并行,您可能无法获得您认为的扩展。根据您要并行化的函数需要多长时间,您可能希望使用其他 pools 之一,例如:pathos.threading.ThreadPool 或来自 pyina 的以 MPI 为中心的池。

    只有 4 个核心和 100 个进程会发生什么情况,这 4 个核心将同时生成 100 个 python 实例......所以这可能会严重影响内存,并且单个核心上的多个 python 实例将竞争对于 cpu 时间...所以最好稍微调整一下配置以找到资源超额订阅和任何资源空闲的正确组合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2020-07-09
      • 2015-09-14
      相关资源
      最近更新 更多