繁体   English   中英

Python多处理的Pool进程限制

[英]Python multiprocessing's Pool process limit

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

您可以根据需要请求多个进程。 可能存在的任何限制将由您的操作系统强加,而不是由multiprocessing强加。 例如,

 p = multiprocessing.Pool(1000000)

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

至于“一次”将运行多少,Python对此没有发言权。 这取决于:

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

对于与CPU绑定的任务,创建比您具有运行它们的核心更多的Pool进程没有任何意义 如果您也尝试将计算机用于其他用途,则创建的进程应少于核心。

对于受I / O约束的任务,创建比内核更多的Pool进程可能是有意义的,因为这些进程可能会花费大部分时间来阻塞(等待I / O完成)。

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

因此,最佳的编程习惯是使用仅限于系统处理器数量的信号量。 可能的

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.  

PS,但始终使用核心数1很好。

希望这可以帮助 :)

尽管没有限制,但可以设置,但是如果您想了解用于CPU绑定进程的便捷数字(我怀疑您在这里正在寻找),则可以运行以下命令:

>>> import multiprocessing
>>> multiprocessing.cpu_count()
1

有关限制的一些好的说明(尤其是在Linux中)在此处的答案中进行了说明

那是正确的。 如果您有4个核心,则可以一次运行4个进程。 请记住,您需要继续进行一些系统工作,将进程号定义为number_of_cores - 1会很好。 这是首选项,不是强制性的。 对于您创建的每个进程都有开销,因此实际上您在使用更多的内存来执行此操作。 但是如果RAM没问题,那就去解决。 如果您正在运行Cuda或其他基于GPU的库,那么您将拥有不同的范例,但这是另一个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM