我有下面的代码,它使用一个函数来进行一些繁重的数值模拟。
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~ CALL THE MULTIPROCESSING ROUTINES ~
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
p = Pool(processes=20) # by default will use 24 processors
p.map(FunctionName, List_NumberOfFiles)
p.close()
p.join()
程序启动良好,如下图所示解决问题:
在此处输入图像描述
几分钟后,它最终没有完全利用20个核心,如下图所示:
在此处输入图像描述
如果有人有类似的问题,如果你能分享一些关于我如何解决这个问题的想法,我将不胜感激。
非常感谢
我肯定希望能够看到您在第二张图片中显示的内容。您首先必须了解多处理池是如何工作的:
List_NumberOfFiles
中有N
元素(因此还有待提交的N
任务(,这些元素将以块的形式放置在单个任务队列中,这些块将根据池(20(和N
的大小进行计算,因为您在对map
的调用中没有显式指定chunksize参数。池中的每个进程在空闲时将从任务队列中汇集下一个"进程";块";并执行这些任务直到完成,然后获取下一个块,直到队列上没有更多块为止。如果所有20个进程同时完成最后一个块的执行,那将是一个奇迹。相反,我希望看到剩下的最后一个进程执行最后一个块。
例如,假设List_NumberOfFiles
中有302个元素(N
=300(。计算出的块大小值将为4。这将产生75个大小为4的块和一个大小为2的块。即使假设每个任务的处理时间大致相同,在20个进程完成前3个块后,也会留下15个完整大小的块和一个小块。这16个块将被16个进程捕获,并且4个进程现在将永久空闲。获取小块的进程(即只有2个任务的进程(将很快永久空闲。剩下的15个进程在完成对其完整大小块的处理时将永久空闲。最有可能的情况是,它们都将在不同的时间结束。
现在假设您已经提交了20个任务(List_NumberOfFiles
作为20个元素(。计算出的块大小将为1,这使得分析更加简单。池中的每个进程在永久空闲之前只有一个任务要处理。如果其中一项任务的处理时间恰好比其他任务长一点,该怎么办?所需时间越长,您将看到除一个进程外的所有进程都处于空闲状态的时间就越长。