是真的,在多处理中,每个进程在CPython中都得到自己的GIL吗?与创建新的运行时有何不同?

问题描述 投票:2回答:1

有什么需要注意的地方吗?我对此有一些疑问。

创建更多GIL的成本是多少?与创建单独的python运行时有何不同?一旦创建了新的GIL,它将按照该过程的要求从头开始创建所有内容(对象,变量,堆栈,堆),还是在当前堆中创建所有副本并创建堆栈? (如果垃圾回收在相同的对象上工作,则垃圾回收会发生故障。)是否将正在执行的代码段也复制到新的CPU内核上?我也可以将一个GIL与一个CPU内核关联吗?

现在复制内容是一项相当占用CPU的任务(如果我做错了,请纠正我,确定是否要进行多处理的门槛是什么?

PS:我正在谈论CPython,但是请随时将答案扩展到您认为有必要的任何地方。

python multiprocessing cpu gil
1个回答
0
投票

第一个标题问题的简短答案是:是的。每个过程都有自己的全局解释锁。在那之后,它变得复杂而不是Python问题,因为它是您的基础流程的问题。

在Linux上,通过multiprocessing生成新进程而不是从头开始创建新的Python解释器应该更便宜:

  • fork()父进程(注:这些天实际上已经使用fork()),子进程已经有了您的代码,并以父母地址空间的副本开头->因为您实际上是在生成正在运行的进程的另一个实例无需clone()(以及与此相关的所有开销)并重新填充其内容。
  • 实际上,当我们说到地址空间的副本时,实际上并不会获取所有副本,而是宁愿使用写时复制;因此,除非您进行了修改,否则根本不需要复制它。

但是实际上这可能有所不同,并且取决于您的基础操作系统如何处理新流程的创建。

© www.soinside.com 2019 - 2024. All rights reserved.