我有一个测试,为什么我可以运行大约5秒,100%的CPU使用时间在我的一个核心。
这是剧本
from threading import Thread
from time import time, sleep
def test0():
start = time()
a = 0
for _ in range(int(1e8)):
a += 1
print(time() - start)
这是跟踪(Ubuntu20.04系统监视器,有1秒的回收箱)
凉爽的。这事儿可以理解。我的一个CPU的工作时间是100%,持续大约5秒。
现在,如果我尝试运行4个线程,每个线程都执行相同的操作,会发生什么呢?以我目前的知识,我认为它们应该是分配在一个核心上的时间,整个过程大约需要20秒。这是剧本
def print_after_work(msg):
a = 0
for _ in range(int(1e8)):
a += 1
print(msg)
def test1():
threads = []
for i in range(4):
threads.append(threading.Thread(target=print_after_work, args=[i+1]))
start = time()
for thread in threads:
thread.start()
sleep(0.2)
for thread in threads:
thread.join()
print(time() - start)
这是痕迹:
因此,我们有4个CPU在大约25%的容量工作。
问题:
threading
模块可以将线程移动到除了主进程之外的不同内核上?发布于 2020-12-05 10:16:00
Python线程不使用多个核心,因为所有线程在内部共享公共数据:Python GIL。
您在图中看到的是OS时间划分的聚合效应-- Python进程本身几乎可以肯定地在每个时间片的内核之间被交换。不能保证一个进程将始终与同一核心保持联系。不过,您的图表并没有显示O/S时间序列的粒度。因此,您所看到的是随着时间的推移,4个核心的聚合,这意味着您将得到每个CPU的25%或相当于一个CPU的100% --正如您在Python多线程上所期望看到的那样,当进程本身被调度时,线程都与同一个CPU挂钩。
https://stackoverflow.com/questions/65133401
复制