子线程内的多处理

Multiprocessing inside a child thread

我正在学习多处理和多线程。

据我了解,线程 运行 在同一个核心上,所以我想知道如果我在子线程中创建多个进程,它们是否也会被限制在单个核心上?

我正在使用 python,所以这是关于该特定语言的问题,但我想知道它是否与其他语言相同?

我不是 pyhton 专家,但我希望这与其他语言一样,因为它通常是一个 OS 功能。

进程

一个进程被OS执行并且拥有一个将被执行的线程。这通常是您的程序。你可以在你的进程中启动更多的线程来做一些繁重的计算或者任何你必须做的事情。 但是他们属于进程。

线程

一个或多个线程由一个进程拥有,执行将分布在所有内核上。

现在回答你的问题

当您创建给定数量的线程时,这些线程通常应该分布在您的所有内核中。他们不限于执行 phyton 解释器的核心。 即使你从你的 phyton 代码创建一个子进程,该进程也可以而且应该 运行 在其他核心上。

您可以在此处阅读有关生殖概念的更多信息: Preemptive multitasking

有一些不同语言的库将线程抽象为通常称为任务或其他东西的东西。 对于这些特殊情况,它们可能只是 运行ning 在创建它们的线程中。 例如。在 DotNet 世界中有一个线程和一个任务。人们在谈论任务时经常会误用术语线程,该任务通常 运行ns 在它创建的线程中。

每个程序都由一个进程表示。进程是一个或多个线程在其中运行的执行上下文。一个进程中的所有线程共享分配给该进程的同一段虚拟内存。

Python(指的是 CPython,例如 Jython 和 IronPython 没有 GIL)是特殊的,因为它有 global interpreter lock (GIL),它防止线程 python 代码来自 运行 在多个并行内核上。只有释放 GIL 的代码才能真正并行运行(I/O 操作和一些 C 扩展,如 numpy)。这就是为什么您必须使用多处理模块来处理 cpu-绑定 python-您需要并行 运行 的代码。进程从多处理模块开始,然后将 运行 它自己的 python 解释器实例,因此您可以真正并行地处理代码。

请注意,即使是单线程 python-应用程序也可以 运行 在不同的内核上,不是并行而是顺序,以防 OS 重新安排执行到另一个内核发生了上下文切换。

回到你的问题:

if I create multiple processes inside a child thread will they be limited to that single core too?

您不在内部线程中创建进程,而是生成新的独立python进程,这些进程具有与原始python进程相同的限制,并且新进程将在哪些核心线程上执行取决于 OS(...只要您不操纵进程的核心亲和性,但我们不要去那里)。