【发布时间】:2016-05-16 06:50:16
【问题描述】:
我正试图了解线程与 CPU 使用率。有很多关于线程与多处理的讨论(一个很好的概述是 this answer)所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU 笔记本电脑上启动最大数量的线程来测试这一点。
我的假设是所有线程都绑定到一个 CPU。
编辑:事实证明这不是一个好的假设。我现在明白,对于多线程代码,一次只能运行 一个 段 python 代码(无论在哪里/在哪个核心上)。这对于多处理代码(其中进程是独立的并且确实独立运行)是不同的。
虽然我读到了这些差异,但实际上是 one answer 澄清了这一点。
我认为它也解释了下面的 CPU 视图:它是分布在许多 CPU 上的许多线程的平均视图,但在给定时间只有一个线程在运行(这“平均”到所有线程都运行时间)。
它不是链接问题的重复(它解决了相反的问题,即一个核心上的所有线程),我将把它挂起来,以防有一天有人有类似的问题,希望我的启发有所帮助。
代码
import threading
import time
def calc():
time.sleep(5)
while True:
a = 2356^36
n = 0
while True:
try:
n += 1
t = threading.Thread(target=calc)
t.start()
except RuntimeError:
print("max threads: {n}".format(n=n))
break
else:
print('.')
time.sleep(100000)
导致启动了 889 个线程。
然而,CPU 上的负载是分散的(对于纯 CPU 计算来说非常低,否则笔记本电脑在不运行我的脚本时会因为空负载而空闲):
为什么会这样?线程是否在 CPU 之间作为一个包不断移动,而我看到的只是一个平均值(现实是在给定时刻所有线程都在一个 CPU 上)?还是它们确实是分布式的?
【问题讨论】:
-
您为什么希望将线程整合到一个内核中?线程的目的是同时执行多个运行中的代码,单个内核一次不能做超过一件事。将它们展开是真正获得并行性的唯一方法。
-
@JarrodRoberson:我的情况实际上与您所链接的问题相反。但它间接地帮助我理解了关键部分:使用多线程,一次只能运行一段 python 代码(无论它在哪个内核上)。这不是多处理的情况(其中进程是独立的,因此不需要 GIL)
-
这是 Python 关于线程的特定限制。这与使用其他语言不同。正如 Rolf Shorpion 所提到的,请参阅 Python 文档中的“全局解释器锁”。
标签: python multithreading