gpt4 book ai didi

python - 在多处理中,每个进程在 CPython 中都有自己的 GIL,这是真的吗?这与创建新的运行时有什么不同?

转载 作者:行者123 更新时间:2023-12-02 23:53:36 26 4
gpt4 key购买 nike

有什么注意事项吗?我有几个相关的问题。

创建更多 GIL 的成本有多大?这与创建单独的 python 运行时有什么不同吗?一旦创建了新的 GIL,它是否会根据该过程的需要从头开始创建所有内容(对象、变量、堆栈、堆),或者创建当前堆中所有内容的副本并创建堆栈? (如果它们在相同的对象上工作,垃圾收集将会发生故障。)正在执行的代码片段是否也被复制到新的 CPU 内核?另外我可以将一个 GIL 关联到一个 CPU 核心吗?

现在复制东西是一项相当 CPU 密集型的任务(如果我错了,请纠正我),决定是否进行多处理的阈值是多少?

PS:我正在谈论 CPython,但请随意将答案扩展到您认为必要的任何内容。

最佳答案

6个月后回头看这个问题,我觉得我可以澄清年轻时的自己的疑惑。我希望这对偶然发现它的人有所帮助。

是的,确实,在多处理模块中,每个进程都有一个单独的 GIL,并且没有任何警告。但问题中对运行时和GIL的理解是有缺陷的,需要纠正。

我将通过一系列陈述来消除疑虑/回答问题。

  1. Python 代码由 CPython 虚拟机运行(编译为 Cpython 字节码,然后解释该字节码)。这就是 python 运行时的构成。
  2. 当我们创建一个新进程时,会启动一个全新的 python 虚拟机(我们称之为 python 进程),其中包含堆栈和堆内存。
  3. 是的,这是一个成本高昂的过程,但成本并不算太高。因为python虚拟机是一段预编译为机器代码的C代码。从长远来看,在 Java 中不使用多处理的原因是它会创建多个 JVM,这会很糟糕,因为 JVM 需要大量内存,而且 JVM 不像 CPython 那样是预编译的机器代码。
  4. GIL 只是 python 虚拟机中的一段代码,它让 CPython 解释器一次只执行一行 CPython 字节码(或一条指令)。因此,所有与 GIL 创建和成本相关的问题都是愚蠢的。基本上的目的是询问 CPython 虚拟机。
  5. 我可以将 1 个 GIL 与 1 个 CPU 核心关联起来吗? : 最好问一下1个Python进程是否可以与1个CPU核心相关? :不。内核的工作是决定进程正在运行哪个核心(并且哪个核心会不时变化,进程无法控制它)。唯一的问题是,在任何给定时间点,一个 python 进程都不能在多个内核上运行,并且一个 python 进程只能执行 CPython 字节码中的一条指令(由于 GIL)。

核心中复制的内容以及操作系统如何尝试让进程保留其正在处理的核心,这本身就是一个单独且非常深入的主题。

最后一个问题是一个主观问题,但根据所有这些理解,它基本上是一种成本效益比,可能因程序而异,并且可能取决于进程的 CPU 密集程度以及机器有多少个核心等。所以不能一概而论。

关于python - 在多处理中,每个进程在 CPython 中都有自己的 GIL,这是真的吗?这与创建新的运行时有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60236745/

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