为什么 time.sleep(0) 让另一个线程在删除 time.sleep 时继续执行 运行 直到循环完成?

Why does time.sleep(0) lets another thread to do stuff when removing time.sleep continues to run until loop is finished?

我正在学习线程,但有一件事情让我感到困惑。

from threading import Thread
from time import sleep
global a
a=0
def th1():
    lasta=0
    while(a<200):
        if(a!=lasta):
            lasta=a
            print(a) 
thrd=Thread(target=th1)
print(a)
thrd.start()
for i in range (1,200):
    a+=1
    sleep(0)

这会打印 0 到 199 之间的数字,但是

from threading import Thread
from time import sleep
global a
a=0
def th1():
    lasta=0
    while(a<200):
        if(a!=lasta):
            lasta=a
            print(a) 
thrd=Thread(target=th1)
print(a)
thrd.start()
for i in range (1,200):
    a+=1

此代码仅打印 0 和 199。

我认为正在发生的事情是,在第二个代码中没有(lats say)停止语句使程序执行代码的不同部分,而第一个代码停止循环并为另一个线程提供执行的可能性。然后它检查 0 秒是否过去并从 for 循环继续。我不知道我是否正确,如果你能帮我解释一下到底发生了什么,我会很高兴。 我怎样才能掌握这种东西?例如 运行 连续两个线程,让它们根据一个全局变量做事。因为我清楚地看到,即使我使用不同的线程,他们并没有真正一起做事,他们仍在等待对方

谢谢!

您的具体问题非常正确:0 秒超时 相当 与根本没有声明不同。如您所料,这将挂起 运行 线程并允许另一个线程接收对 CPU.

的控制

如果您仅使用多线程,那么您会遇到此处描述的交错情况:您有两个逻辑 执行 线程,但只有一个逻辑 处理器。对于并行处理,您需要多处理。网上有许多教程和示例;只需搜索 "Python multiprocessing tutorial".

您的请求 "how can i master this kind of things?" 过于笼统,不能作为 Stack Overflow 问题。你掌握这些知识就像你掌握任何知识一样:你找到符合你学习风格的材料,研究这些材料,然后练习。

多线程运行取决于环境。线程没有 'do stuff together'。他们 运行 有点独立。

在单处理器机器上,或者在一个程序中 运行 在单个处理器上运行多个线程,它们永远不会同时 运行。每个线程获得一个时间片。它 运行s 持续一段固定的时间(除非它提前产生,就像睡眠一样)。当它的时间片完成时,下一个线程 运行s 持续一段固定的时间,或者直到它产生。

在您的第一个示例中,主线程每次递增都会产生,因此 th1 线程每次递增都会 运行 一次,并且会看到每个数字。

在第二个示例中,主线程将在 th1 线程被赋予执行时间之前 运行 一个完整的时间片。这足以让主线程中的循环循环多次。当第 1 个线程再次 运行s 时,它有 'missed' 多个 a 的值。