繁体   English   中英

每个线程是否运行它自己的解释器循环?(CPython)

[英]Does each thread run it's own interpreter loop?(CPython)

当我们运行一个线程应用程序时,它看起来很容易。 CPython 解释器运行一条一条的字节码指令并立即执行。 但是,如果我们从第一个线程开始另一个线程,它是否有自己的循环消耗字节码,并且它们共享一些常见的 memory 用于同步(GIL 等),或者以某种方式从第一个(主)线程委托指令循环第二个? 事情我无法弄清楚第二个线程如何获取指令,如果需要不断解释它需要执行什么。 我知道由于 GIL,它不会并行运行,但是关于解释指令的问题,它是否发生在两个线程中?

import threading

def thread_function(value):
    print(value)

if __name__ == "__main__":

    x = threading.Thread(target=thread_function, args=(1,))
    x.start()

在哪个线程print(value)将被解释(主线程或子线程)?

我认为阅读 CPython 代码会有所帮助。

您将在ceval.c中找到所需的所有详细信息

我对 CPython 也很陌生。 我将尝试分享我的理解。

  1. 主循环(永远运行或 python 解释循环从第 1184 行开始,for(;;)
  2. 您可以尝试使用 dis 模块并了解 python 代码如何转换为字节码
  3. 解释器将获取字节码并一一执行
  4. 线程如何切换? 第 1233-1250 行,线程切换

您可以想象,一旦您调用 threading.Thread,用于创建线程 object 及其目标 function 的字节码将被添加到当前指令列表中。

当解释器处理这个字节码时,它会注意到创建了一个新线程(这一步我不太确定。你可以检查 ceval.py 和线程模块来验证)。

现在您有两个字节码列表供 python 解释器使用。

它会根据自己的规则轮流(即每个线程每100条指令然后决定是否切换,特殊信号处理或其他)

希望它能解答你的疑惑。

寻求深刻的理解,不把任何事情视为理所当然,这很好!

希望您能愉快地探索 cpython。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM