【问题标题】:multiprocessing.Pool spawns too many threadsmultiprocessing.Pool 产生太多线程
【发布时间】:2020-12-04 23:25:55
【问题描述】:

如果我运行以下 python 代码

def dummy(t):
    A = np.random.rand(10000, 10000)
    inv = np.linalg.inv(A)
    return np.linalg.norm(inv)


if __name__ == "__main__":
    with multiprocessing.Pool(2) as pool:
        print(pool.map(dummy, range(20)))

产生了超过指定的 2 个进程,或者至少看起来是这样。更具体地说,当我使用htop 监控系统时,它会将所有线程显示为繁忙,即 100% 的 CPU 使用率。 我希望只有 2 个线程显示完全 100% 的使用率,但也许这个假设是错误的。

奇怪的是,如果矩阵大小增加(增加 10 倍),只有指定的 2 个线程处于忙碌状态。

使用的 python 版本:3.6.9 / 3.8.5。 机器:40核的skylake服务器。

【问题讨论】:

  • multiprocessing 用于生成单独的进程,因此所有关于线程的讨论似乎都无关紧要。
  • 多重处理和子处理?钉住?线程? “矩阵大小增加,仅产生 2 个指定线程”? (您在池中只指定了 2 个进程)。我无法关注这些​​。
  • @Booboo,我已将问题更新为仅包含示例。我认为我使用多处理的动机会有所帮助,但它只会带来混乱。我希望这个问题在简化版中更容易理解。
  • @martineau 很抱歉,如果命名不清楚,老实说,我不太确定进程和线程之间的区别。关键是 htop 显示所有硬件线程都处于活动状态,尽管我希望只有两个处于活动状态。
  • 我的桌面上有 8 个核心处理器,如果我只调用 dummy 作为函数而不使用多处理,我的 cpu 利用率将达到 100%。这强烈表明numpy 库本身(使用 C 语言代码)可能正在使用多个内核。请参阅numpy.org/devdocs/reference/…,它描述了numpy.linalg 在 C 语言意义上是“多线程”的(这与 Python 意义上的不同,因为两个 Python 线程不能同时执行 Python 代码,因此不会占用 CPU)。

标签: python numpy multiprocessing threadpool python-multiprocessing


【解决方案1】:

正如@Booboo 的评论所暗示的,该示例包含未考虑的额外并行性。 numpy.linalg.inv 调用很可能在后台使用了某种多线程。因此,只有与Pool 构造函数中指定的进程数一样多的硬件线程的假设是无效的。如果额外并行的来源已知并且可以禁用,则可以实现预期的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2011-10-11
    • 2021-05-05
    • 2017-02-01
    相关资源
    最近更新 更多