python 中的多处理与核心数

Multiprocessing in python vs number of cores

如果一个 运行 一个 python 脚本,其中我使用多处理声明了 6 个进程,但我只有 4 个 CPU 核心,那么额外的 2 个进程会发生什么专用 CPU 核心。

  1. 它们是如何执行的?
  2. 如果两个额外的进程 运行 作为现有核心上的单独线程,GIL 不会停止它们的执行吗?

#Edit 1 - 2021 年 1 月 21 日

我在我问的问题中混淆了线程和进程。由于我对这个概念有了更清晰的认识,我将问题 2 改写如下(以供将来参考):

如果这两个额外的进程运行与现有核心中的另外两个进程并行,GIL 不会停止它们的执行吗?

A​​ns:GIL不影响进程,GIL一次只允许一个线程运行,但是对进程没有限制。系统调度程序管理额外的两个进程如何 运行 在现有核心上。

首先,您混淆了线程和进程:在 Python 中,只有线程而非进程必须在其解释器上共享锁。 如果您正在使用多处理库,那么您正在使用 Python 具有自己的解释器的进程。

当您使用 Python 进程时,它们的执行由您的操作系统调度程序管理,其方式与您计算机中的所有其他进程相同。 如果您的进程多于 CPU 个核心,那么额外的进程将在后台等待调度。 这通常发生在其他进程终止、等待 IO 或周期性时钟中断时。

确保使用

始终是最佳做法
pool = multiprocessing.Semaphore(multiprocessing.cpu_count() - 1) 
#this will detect the number of cores in your system and creates a semaphore with that value.  

当您创建一个进程时,它需要开销来管理它、它的内存 space 和它的共享内存。此外,操作系统必须 运行,因此让核心空闲始终是有礼貌的,可以加快问题的执行速度。