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

时间:2019-11-07 15:04:40

标签: python multithreading interpreter cpython

当我们运行一个线程应用程序时,这看起来很容易。 CPython解释器一一运行字节码指令并立即执行它。但是,如果我们从第一个线程开始另一个线程,它是否有自己的消耗字节码的循环,并且它们共享一些用于同步的公共内存(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)(主线程或子线程)中进行解释?

1 个答案:

答案 0 :(得分:1)

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

您将在ceval.c

中找到所有所需的详细信息

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

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

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

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

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

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

希望它能回答您的疑问。

寻求深刻的理解而不是理所当然的事情真是太好了!

希望您能度过愉快的时光探索cpython。