【问题标题】:Multiprocessing in python vs number of corespython中的多处理与内核数
【发布时间】:2021-01-20 13:57:26
【问题描述】:

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

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

#编辑 2021 年 1 月 1 日至 21 日

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

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

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

【问题讨论】:

  • 第一个问题:是的,多处理通过不同的内核拆分任务。然而,这些核心已经被用来处理任务,并将更多的放在使用较少的核心上。 multiprocessing 遵循一个系统,系统可以随时停止任务(如果出现其他任务)。但是,当有很多任务时,这可能会导致性能下降。
  • 有道理。谢谢。

标签: python multiprocessing cpu-cores


【解决方案1】:

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

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

【讨论】:

  • 谢谢@Ipeak,这就是我想要的。我的问题的答案是“当您使用 Python 进程时,它们的执行由您的操作系统调度程序管理,就像您计算机中的所有其他进程一样。如果您的进程多于 CPU 内核,那么额外的进程正在等待背景要安排。”
【解决方案2】:

确保使用

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

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

【讨论】:

  • 这很有用。我会确保我在此灌输这种做法!
猜你喜欢
  • 2022-01-18
  • 2010-11-14
  • 2017-07-02
  • 2021-04-22
  • 2014-12-17
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多