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