Python的多处理:处理2000和处理(Python multiprocessing: deali

2019-10-31 09:06发布

以下是我的多处理代码。 regressTuple大约有2000项。 所以,下面的代码创建2000年左右并行处理。 该程序运行时我的戴尔XPS 15个笔记本死机。

  1. 不能蟒蛇多处理库根据硬件可用性处理队列中,而不会在最短的时间内崩溃运行程序? 我不能正确地这样做呢?
  2. 有没有在Python API调用来获取可能的硬件处理计数?
  3. 我如何重构使用输入变量来打通穿几次,直至完成并行线程数(硬编码)和循环的代码 -这样一来,一些实验后,我就能得到最佳的线程数。
  4. 什么是不崩溃运行在最短的时间这段代码的最佳方式。 (我不能在我的实现中使用多线程)

特此我的代码:

regressTuple = [(x,) for x in regressList]
processes = []

for i in range(len(regressList)):                  
    processes.append(Process(target=runRegressWriteStatus,args=regressTuple[i]))

for process in processes: 
    process.start() 

for process in processes:
    process.join()

Answer 1:

有迹象表明,我们需要记住多件事情

  1. 纺纱工艺的数量不会被你的系统上的核心数量,但有限ulimit为你的系统中的用户ID来控制的,通过你的用户ID启动的进程总数。

  2. 核心的数目确定有多少启动过程实际上可以并行地在同一时间运行。

  3. 您的系统可以轰然由于这些进程正在运行的是做一些繁重和资源密集型的,哪个系统不能处理时,多个进程同时运行,或者你的目标函数nprocs系统上的限制已经耗尽,现在的内核不能够旋转的新系统进程。

话虽这么说,是不是即使你有一个16核英特尔SKYLAKE微架构的机器,因为在系统上创建一个新的过程不是一个重量轻的任务,因为有东西数量不管产卵多达2000的过程,是个好主意像生成的PID,分配存储器,地址空间生成,调度的过程中,上下文切换和管理的它的整个生命周期中的背景这种情况发生。 所以这是一项繁重的操作为内核,以生成新的进程,

不幸的是我猜你正在尝试做的是一个CPU绑定的任务,因此,您所拥有的机器上硬件的限制。 纺纱更多数目少于核心的系统上的数字过程不会在所有帮助,但创建一个进程池可能。 所以基本上你想创建尽可能多数量的进程池有您的系统上的核心,然后通过输入到池中。 像这样的事情

def target_func(data):
    # process the input data

with multiprocessing.pool(processes=multiprocessing.cpu_count()) as po:
    res = po.map(f, regressionTuple)


Answer 2:

  1. 不能蟒蛇多处理库根据硬件可用性处理队列中,而不会在最短的时间内崩溃运行程序? 我不能正确地这样做呢?

我不认为这是Python的责任来管理队列长度。 当人们对多处理伸出他们往往要效率,从而提高系统性能测试运行队列将是一个开销。

  1. 有没有在Python API调用来获取可能的硬件处理计数?

如果有,它会提前知道的时候你的任务将需要多少内存?

  1. 我如何重构使用输入变量来打通穿几次,直至完成并行线程数(硬编码)和循环的代码 - 这样一来,一些实验后,我就能得到最佳的线程数。

作为balderman指出,一个游泳池是一个很好的出路与此有关。

  1. 什么是不崩溃运行在最短的时间这段代码的最佳方式。 (我不能在我的实现中使用多线程)

使用游泳池,或由〜3MB采取可用的系统内存,鸿沟,看你能有多少任务同时运行。

这可能是更系统管理员任务来平衡对队列长度的瓶颈,但一般来说,如果你的任务是IO约束,那么有没有有,如果所有的任务都在同一个等了很久任务队列多点丁字路口变成了路。 那么任务将相互争夺IO的下一块。



文章来源: Python multiprocessing: dealing with 2000 processes