Python多处理的池进程限制

时间:2013-11-18 03:37:10

标签: python multiprocessing cpu-cores

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

4 个答案:

答案 0 :(得分:40)

您可以根据需要申请任意数量的流程。您的操作系统可能会施加任何可能存在的限制,而不是multiprocessing。例如,

 p = multiprocessing.Pool(1000000)

可能会在任何机器上遭受丑陋的死亡。当我输入这个时,我正在我的盒子上尝试它,并且操作系统正在研磨我的磁盘,以便在生成大约3000个进程之后最终将其删除; - )

至于有多少人会“同时”运行,Python对此没有发言权。这取决于:

  1. 您的硬件有多少能够同时运行;和,
  2. 您的操作系统如何决定为所有当前正在运行的计算机上的进程提供硬件资源。
  3. 对于CPU绑定的任务,它不会使感觉创建更多的Pool进程,而不是运行它们的核心。如果你也试图将你的机器用于其他事情,那么你应该创建比核心更少的进程。

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

答案 1 :(得分:24)

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

所以最好的编程习惯是使用限制于系统处理器数量的信号量。可能

pool = multiprocessing.Semaphore(4) # no of cpus of your system.

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

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

P.S。但总是使用核心数量1是好的。

希望这会有所帮助:)

答案 2 :(得分:7)

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

process.isAlive()

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

答案 3 :(得分:6)

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