我在共享集群上工作。我见过人们在这个集群上运行并行化的 c 代码,当我用来top
查看正在运行的进程时,显示使用了(例如)400% 的 CPU,因为他们为单个实例使用了四个处理器他们的代码。
现在有人正在运行(据我所知)并行化的 Python 代码。然而,Python 代码并没有top
显示为使用 400% 的 CPU,而是显示为四个不同的进程,每个进程都使用自己的处理器(100%)。
我想知道,Python(并行化时)是否显示top
运行尽可能多的不同进程(与 C 相反),或者该 Python 代码实际上并未并行运行?
我不知道 Stack Exchange 是否是解决这个问题的更好地方。因为我正在使用,所以top
我认为这个地方会更好。让我知道是否应该移动它。
答案1
你在 C 中看到的是使用线程,因此进程使用量是其所有线程的总和。如果有 4 个线程,每个线程的 CPU 使用率都是 100%,则该进程将显示为 400%
你在 python 中看到的几乎肯定是通过多进程模型实现的并行性。这是一个旨在克服 Python 线程限制的模型。 Python 一次只能运行一个线程(请参阅 Python 全局解释器锁 - GIL)。为了做得更好,可以使用多进程模块,它最终会创建进程而不是线程,而线程又在 ps 中显示为多个进程,然后每个进程可以使用高达 100% 的 CPU,因为它们都是单进程螺纹。
我敢打赌,如果您运行,ps -afeT
您将看到 C 程序的线程,但看不到 python 程序的其他线程。
答案2
参考 Python 实现 CPython 具有全局解释器锁 (GIL),这会阻止它在以下环境中运行代码:平行线, 仅有的同时。线程仅对 I/O 有用。您需要多个进程才能并行执行。您正在查看的 C 代码很可能使用线程来实现并行性。