【问题标题】:How do Python processes and threads map onto hardware threads?Python 进程和线程如何映射到硬件线程?
【发布时间】:2019-12-19 11:12:06
【问题描述】:

我的问题与this one 类似,但我正在寻找有关它如何使用的最新信息:

  • Python

  • 在 Linux 上运行

  • 在线程数多于内核数的 CPU 上。

假设一个 CPU 有 4 个核心和 8 个线程,例如,给定以下代码:

from multiprocessing.dummy import Pool as ThreadPool
from multiprocessing import Pool as ProcessPool


with ThreadPool(number_of_threads) as pool:
    pool.map(some_function, some_iterable)

with ProcessPool(number_of_processes) as pool:
    pool.map(some_function, some_iterable)

我想知道这些线程和进程将如何映射到 CPU 内核和线程(如果有的话)。例如:

  • 如果 number_of_processes 为 8,每个进程可能最终都在一个 CPU 线程上吗?

  • 如果 number_of_threads 为 8,每个线程可能最终都在一个 CPU 线程上吗?

  • 如果 number_of_threads 远高于内核/CPU 线程数,会有什么影响?

  • some_function 是 IO 绑定还是 CPU 绑定对上述任何一项都有影响吗?

我总是将 ThreadPool 用于 IO 绑定,将 ProcessPool 用于 CPU 绑定。使用 ProcessPool,我发现使用与 CPU 内核相同的 number_of_processes 效果很好。但我不知道 ThreadPool 我的基准应该是什么。

【问题讨论】:

    标签: python multithreading concurrency hardware


    【解决方案1】:

    我认为一个重要的免责声明是:理论上的“它应该如何工作”只会到目前为止。对于实际性能比较,即 4、6、8 或任意数量线程的线程池之间的性能差异,唯一的具体答案来自使用实际工作负载对目标系统进行基准测试。

    此处提供答案的最重要问题之一是:

    some_function 是否对上述任何内容都有影响 IO 限制还是 CPU 限制?

    这是 IMO 最重要的性能问题。您的工作量是多少 (some_iterable)?是 I/O 绑定还是 CPU 绑定? I/O 绑定是发出 http 请求,或查询数据库或文件系统。 CPU 限制正在执行某种计算、散列、添加、解析等。大多数工作负载(根据我的经验是混合的,但如果我不得不根据经验说,偏爱 I/O)。如果工作负载是 I/O 并且 some_iterable 正在执行同步 I/O,那么您很可能通过创建更大的工作池来扩展性能,因为大多数时间进程/线程正在执行将花费在 I/O 上!

    如果 number_of_processes 为 8,每个进程是否可能最终都在一个 cpu 上 线程?

    有点:p。你有 8 个物理线程。每个池有 8 个进程/主线程,加上执行程序的线程,以及操作系统的所有其他进程/线程 :)。您的处理器已饱和。如果您有一个 CPU 绑定的工作负载,它们将会饱和,并且您可能不会看到超过 7-8 个池大小的性能提升。如果您的工作负载受 I/O 限制,您可能仍会看到池大小大于您拥有的处理器数量时性能提高。

    如果 number_of_threads 为 8,每个线程是否可能最终都在一个 cpu 上 线程?

    与上面的处理器问题相同。是的,它们很可能最终会出现在 CPU 线程上。如果您的工作负载受 I/O 限制,则增加池大小可能仍会在一段时间内提高性能。
    对于受 CPU 限制的工作负载,这就是事情变得复杂的地方。 Python 的GIL prevents python from executing multiple python bytecode at once。即使您将有足够的物理 CPU 线程来执行您的程序,但您一次只能执行一个线程!如果 CPU 绑定的工作负载 number_of_threads = 8 比 number_of_threads = 4 对于 CPU 绑定的工作负载提供更好的性能,我会感到惊讶!

    如果 number_of_threads 远高于 核心/CPU线程数?

    对于 I/O 绑定的工作负载,什么都没有!根据您的机器调度和执行大量线程的能力或上游服务为您发出的所有请求提供服务的能力,您有时会遇到性能限制。对于 CPU 密集型工作负载,请参阅上面的答案(由于 GIL,您会更快地达到限制)。

    参考资料:


    此外,在我主要从事基于 http 的服务的经验中,将逻辑核心(硬件线程)视为与物理核心相同,并没有再回来咬我。因此,在您的情况下,我只会认为您有 8 个可用内核。区别可能对您的工作量不重要(在黑暗中拍摄)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多