在使用多处理模块中的Pool对象时,进程数是否受CPU核心数限制?例如。如果我有4个核心,即使我创建了一个包含8个进程的池,一次只能运行4个?
答案 0 :(得分:40)
您可以根据需要申请任意数量的流程。您的操作系统可能会施加任何可能存在的限制,而不是multiprocessing
。例如,
p = multiprocessing.Pool(1000000)
可能会在任何机器上遭受丑陋的死亡。当我输入这个时,我正在我的盒子上尝试它,并且操作系统正在研磨我的磁盘,以便在生成大约3000个进程之后最终将其删除; - )
至于有多少人会“同时”运行,Python对此没有发言权。这取决于:
对于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的库,那么您将拥有不同的范例,但那是另一个问题。