Python多处理的池进程限制

rot*_*o56 35 python multiprocessing cpu-cores

在使用多处理模块中的Pool对象时,进程数是否受CPU核心数限制?例如,如果我有4个核心,即使我创建了一个包含8个进程的池,一次只能运行4个核心?

Tim*_*ers 42

您可以根据需要索取任意数量的流程.可能存在的任何限制将由您的操作系统强加,而不是由multiprocessing.例如,

 p = multiprocessing.Pool(1000000)
Run Code Online (Sandbox Code Playgroud)

在任何机器上都可能遭受丑陋的死亡.当我输入这个时,我正在我的盒子上尝试它,并且操作系统正在研磨我的磁盘,以便将麦克风疯狂地交换掉 - 最终在创建了大约3000个进程后将其杀死;-)

至于有多少人会"同时"运行,Python就没有发言权.这取决于:

  1. 您的硬件能够同时运行多少; 和,
  2. 操作系统如何决定为当前运行的计算机上的所有进程提供硬件资源.

对于CPU绑定的任务,创建比运行它们的内核更多的进程没有意义Pool.如果您正在尝试将您的计算机用于其他任何事情,那么您应该创建比核心更少的进程.

对于I/O绑定任务,创建比核心更多的进程可能是有意义的Pool,因为进程可能会花费大部分时间来阻塞(等待I/O完成).


Sra*_*ala 25

是.从理论上讲,您可以创建的流程没有限制,但是由于内存不足,一次启动的疯狂数量的流程将导致系统死亡.请注意,进程占用的空间比线程大得多,因为它们之间不使用共享空间,而是为每个进程使用单独的空间.

所以最好的编程习惯是使用限制在系统处理器数量的信号量.容易

pool = multiprocessing.Semaphore(4) # no of cpus of your system.
Run Code Online (Sandbox Code Playgroud)

如果您不了解系统的内核数量,或者您想在许多系统中使用该代码,那么下面的通用代码将会...

pool = multiprocessing.Semaphore(multiprocessing.cpu_count()) 
#this will detect the number of cores in your system and creates a semaphore with that  value.  
Run Code Online (Sandbox Code Playgroud)

PS但总是使用核心数量1是好的.

希望这可以帮助 :)


小智 7

虽然没有限制你可以设置,如果你想了解一个方便的数字用于CPU绑定进程(我怀疑你在这里寻找),你可以运行以下:

>>> import multiprocessing
>>> multiprocessing.cpu_count()
1
Run Code Online (Sandbox Code Playgroud)

关于限制的一些好的注释(特别是在linux中)在这里的答案中注明:


Bac*_*ics 6

那是正确的.如果您有4个核心,则可以同时运行4个进程.请记住,您需要继续使用系统内容,并且定义流程编号会更好number_of_cores - 1.这是一种偏好而非强制性.对于您创建的每个进程都存在开销,因此您实际上使用了更多内存来执行此操作.但如果RAM不是问题,那就去吧.如果你正在运行Cuda或其他一些基于GPU的库,那么你有一个不同的范例,但那是另一个问题.