子线程内的多处理

时间:2018-08-28 00:50:20

标签: python multithreading multiprocessing python-multiprocessing python-multithreading

我正在学习有关多处理和多线程的知识。

据我了解,线程在同一内核上运行,所以我想知道如果我在子线程内创建多个进程,它们是否也将限于该单个内核?

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

2 个答案:

答案 0 :(得分:0)

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

过程

一个进程由OS执行,并拥有一个将要执行的线程。这通常是您的程序。您可以在进程内部启动更多线程以进行大量计算或您必须执行的任何操作。 但是它们属于该过程。

线程

一个或多个线程归一个进程所有,执行将分布在所有内核中。

现在您的问题

创建给定数量的线程时,这些线程通常应分布在所有内核中。它们不仅限于执行phyton解释器的核心。 即使您是根据phyton代码创建子流程的,该流程也可以并且应该在其他内核上运行。

您可以在此处阅读有关原始概念的更多信息: H20

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

答案 1 :(得分:0)

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

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

请注意,即使在上下文切换后操作系统将执行重新安排到另一个内核的情况下,即使单个线程的python应用程序也可以在不同的内核上运行,而不是并行运行,也可以顺序运行。

回到您的问题:

  

如果我在子线程中创建多个进程,它们是否也将限于该单个内核?

您不会在线程中创建进程 ,而是生成具有与原始python进程相同的限制的新的独立python进程,并且新线程将在其上执行操作系统(...只要您不操纵进程的核心亲和力,就不要去那里了)。