当我们运行一个线程应用程序时,它看起来很容易。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)
(主线程还是子线程(?
我认为阅读CPython代码会有所帮助。
您将在ceval.c 中找到所需的所有详细信息
我也是CPython的新手。我会努力分享我的理解。
- 主循环(永远运行或python解释循环从第1184行开始,for(;(
- 您可以尝试dis模块,了解python代码是如何转换为字节码的
- 解释器将获取字节码并逐个执行
- 线程是如何切换的?线路1233-1250,线程切换
你可以想象,一旦你调用线程。线程、用于创建线程对象的字节码及其目标函数将被添加到当前指令列表中。
当解释器处理这个字节码时,它会注意到创建了一个新的线程(这一步我真的不确定。你可以检查ceval.py和线程模块来验证(。
现在您有两个字节码列表供python解释器使用。
它将根据自己的规则轮流(即每个线程每100条指令,然后决定是否切换、特殊信号处理或其他(
希望它能回答你的疑虑。
寻求深刻的理解,不认为任何事情都是理所当然的,这太棒了!
希望你能有一个愉快的时间探索cpython。