【发布时间】: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