Python多处理池API没有';当进程计数和工作人员计数增加时,无法有效工作

Python多处理池API没有';当进程计数和工作人员计数增加时,无法有效工作,python,python-3.x,multithreading,multiprocessing,python-multiprocessing,Python,Python 3.x,Multithreading,Multiprocessing,Python Multiprocessing,我正在尝试应用多处理来并行化我的代码。我有大约2000件作品要完成。由于创建2000个并发进程是不实际的,所以我使用pythonmultiprocessing.poolAPI在管理任务队列时使工作并行化。我试着创造100名工人。但它花了数小时才完成,与顺序实现相比,这并不是一个很大的收益。我的笔记本电脑有12个逻辑核心。然后我尝试同时增加工人和工人的数量。从技术上讲,每项工作完成的时间应该是相同的,因为我每次只给一个工人分配一项工作。但我体验到,即使每个工作的工作量没有改变,完成过程的时间也会增

我正在尝试应用多处理来并行化我的代码。我有大约2000件作品要完成。由于创建2000个并发进程是不实际的,所以我使用pythonmultiprocessing.poolAPI在管理任务队列时使工作并行化。我试着创造100名工人。但它花了数小时才完成,与顺序实现相比,这并不是一个很大的收益。我的笔记本电脑有12个逻辑核心。然后我尝试同时增加工人和工人的数量。从技术上讲,每项工作完成的时间应该是相同的,因为我每次只给一个工人分配一项工作。但我体验到,即使每个工作的工作量没有改变,完成过程的时间也会增加。API有什么问题吗?还是我做错了?有人能为我的2000年作品提供一个可能的解决方案,用Python在最短的时间内并行处理吗

注意:由于代码实现问题,我不能使用多线程

我的代码

inputListLen = 13
workerCount = 13
regressList = regressList[:inputListLen] # regressList has 2000 items
with Pool(processes=workerCount) as pool:
    print(pool.map(runRegressWriteStatus, regressList))
结果

Input List Len  | workers   | Time(seconds) 
1               | 1         | 4.5  
2               | 2         | 4.9  
3               | 3         | 5.4  
4               | 4         | 5.6  
5               | 5         | 6.3  
6               | 6         | 7.2  
7               | 7         | 8.3  
8               | 8         | 9.6  
9               | 9         | 10.0 
10              | 10        | 10.7 
11              | 11        | 11.6 
12              | 12        | 11.8 
13              | 13        | 13.3 

我认为你误解了一些事情,对一些事情的假设并不准确。正如我在这里提到的,实际上可以与
多处理并行运行的进程数量取决于系统上的cpu内核数量,并受其控制。启用超读时,您看到的是实际的物理核心,而不是逻辑核心

所以12个逻辑核意味着6个物理核,每个核2个线程就有12个逻辑核。所以,在任何时候,内核都会看到12个逻辑内核,它会尝试调度12个进程,但系统只有6个物理内核,所以会有很多上下文切换,使其看起来像是有12个内核,但在任何时候,实时进程都不能超过6个,因为请记住,您只有6个内核

其次,
Pool
的工作方式与
Process
不同,而使用
Process
可以启动并行进程来执行彼此独立的任务

有不同的用途,使用
Pool
对象,您将创建一个进程的
池,然后将一个大任务/输入传递给it,然后
Pool
将这个大任务/输入划分为一个较小的任务/输入,并将其分配给
进程,这些进程可以同时对较小的输入进行操作

下面是一个非常简单的示例,说明如何使用

import multiprocessing as mp
import time


def f(x):
    res = 0
    for i in range(x):
        res += i ** 6


if __name__ == '__main__':
    t1 = time.time()
    # MP Pool creates 4 concurrent processes and run the same function with diffrent args, to achieve the parallel computation
    po = mp.Pool(processes=4)
    res = po.map(f, range(5000))
    po.close()
    po.join()
    print('Parallel execution time taken = {}'.format(time.time() - t1))

    t2 = time.time()
    seq_res = list(map(f, range(5000)))
    print('Sequential execution time taken = {}'.format(time.time() - t2))

(py37) rbhanot@rbhanotlinux ~/home » python 7-1.mppool.py
Parallel execution time taken = 0.91422438621521
Sequential execution time taken = 2.9315543174743652
(py37) rbhanot@rbhanotlinux ~/home » 
如您所见,使用
pool
的并行执行所花费的时间比顺序执行少3倍

现在我的机器上有8个逻辑核,但只有4个物理核,而且最多我的内核一次只能调度4个进程,因此创建一个包含4个以上进程的池不会有任何区别,下面就是一个证明

使用7个进程池运行时

使用12个进程池运行时

使用2个进程池运行时

+1用于保持现场整洁。
Parallel execution time taken = 0.9177846908569336
Parallel execution time taken =  0.9213907718658447
Parallel execution time taken = 1.712911605834961