2012-09-02 43 views
1

我在Intel(R)Core(TM)2 Duo CPU E7500 @ 2.93GHz下运行多线程应用程序(Python2.7.3)。我认为这将只使用一个核心,但使用“顶级”命令我看到,python进程不断地改变核心号。在顶部命令中启用“SHOW THREADS”显示在不同内核上工作的不同线程进程。Python多线程,它如何使用多个内核?

任何人都可以解释一下吗?正如我从理论中知道的那样,多线程是在单核上执行的,这让我感到困扰。

+3

“我从理论上知道多线程是在单核上执行的。”我不确定你从哪里得到。如果那是真的,那将会失败人们使用多线程的主要原因之一。 –

回答

3

首先,多线程意味着的逆,即多个内核正在同时使用(通过线程)。当涉及到这个时,CPython确实会受到损害,不过无论何时调用C代码(这包括标准库的一部分,还包括像Numpy这样的扩展模块),可以解锁防止并发执行Python代码的锁。您仍然可以拥有多个线程,但它们不会同时解释Python(相反,它们会频繁轮换)。你还会说“Python 进程” - 你是混淆术语,还是这个“多线程”的Python应用程序实际上是multiprocessing当然多个Python进程可以同时运行。

但是,从您的措词我怀疑另一个混乱的来源。即使是单个线程也可以在多个核心上运行......只是不能同时运行。这取决于操作系统哪个线程在哪个CPU上运行,OS调度程序不一定会将线程重新分配给它在暂停之前运行的同一个CPU(这是有益的,正如David Schwartz在评论,但不重要)。也就是说,单个线程/进程从CPU跳转到CPU是完全正常的。

+0

感谢您的解释。我只使用CPython中的线程模块。我有一个有缺陷的想法,即一个线程只能在单个核心中运行。 –

+2

实际上,许多操作系统调度程序确实尝试在上次运行的相同CPU上重新调度线程。他们这样做有两个原因:首先,有一些数据仍然存在于某个CPU缓存中。其次,为了避免在全局调度器锁上产生太多冲突,使用具有自己的锁的每个内核调度器结构。因此,将一个线程从一个核心移动到另一个核心需要更多的处理(将其从一个核心的线程集合移动到另一个核心的线程集合,而在每个核心上分别具有不同的锁定),而不是在同一核心上重新运行。 –

+0

@DavidSchwartz非常有趣,谢谢。我会调低这个句子。 – delnan

0

线程旨在利用多个内核时可用。如果你只有一个核心,他们也会在一个核心上运行。 :-)

没有什么可关注的,你观察到的是“按预期工作”。