gpt4 book ai didi

python - 为什么我能够运行的并发线程数多于我的 CPU 数?

转载 作者:行者123 更新时间:2023-12-03 12:48:49 25 4
gpt4 key购买 nike

我的 CPU 有 4 个核心,所以据我了解 Python 中的线程,这意味着我只能同时运行 4 个线程。我想测试一下,所以我写道:

import threading
from time import sleep

def print_after_sleep(msg):
sleep(5)
print(msg)

one = threading.Thread(target=print_after_sleep, args=[1])
two = threading.Thread(target=print_after_sleep, args=[2])
three = threading.Thread(target=print_after_sleep, args=[3])
four = threading.Thread(target=print_after_sleep, args=[4])
five = threading.Thread(target=print_after_sleep, args=[5])
six = threading.Thread(target=print_after_sleep, args=[6])
one.start()
sleep(0.2)
two.start()
sleep(0.2)
three.start()
sleep(0.2)
four.start()
sleep(0.2)
five.start()
sleep(0.2)
six.start()

我希望线程 1-4 能够快速连续地打印它们的消息,但随后要等待近 5 秒才能让线程 5-6 打印它们的消息。我实际上得到的是所有线程快速连续地打印它们的消息。

最佳答案

我们先来谈谈线程。

现代应用程序中的线程数几乎总是多于机器 CPU 中的内核数。每个线程都被分配一个特定的核心。然后,核心以分时方式执行每个线程。执行的线程由操作系统的调度程序决定。

您在这里的误解是调度程序在线程之间切换所花费的时间。切换最多以微秒(1e-6 秒)的量级完成。花费 5-6 秒来切换线程将使当今的大多数软件变得毫无用处。

关于Python的细节,该语言受到全局解释器锁的限制,或GIL 。简而言之,这可能会导致所有线程都在单个核心上运行。

编辑

线程具有不同的状态,这有助于操作系统调度程序优化其操作。

Thread states

我不会详细介绍上图。您需要了解的全部内容如下:

  1. 单个核心中多个线程可以处于“就绪”状态。这本质上意味着它们可以在调度程序允许时执行。

  2. 每个核心只能“运行”一个线程。所有其他线程将处于“就绪”或“阻塞”状态(也称为“等待”)。

  3. 当您调用sleep时,线程基本上会进入不同的状态。当没有“正在运行”的线程时,调度程序将立即分配一个“就绪”线程来运行。在您的例子中,这是一个已完成等待 5 秒的线程。

在您的程序中,天真的解释是所有线程都“阻塞”5 秒。分配的核心当时可能甚至没有运行您的程序。然后,所有线程同时进入“就绪”状态,调度程序一次执行一个线程。

关于python - 为什么我能够运行的并发线程数多于我的 CPU 数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65039412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com