3

1) 我已经读过,如果我在 python 中导入线程模块,CPU 绑定负载不会从使用这个库中看到太多好处,因为即使我在多核机器上运行代码,GIL 也会强制线程一次运行 1 个. 如果是这种情况,什么样的代码会从使用 Python 的线程库中受益?

2)如果线程库是这种情况,那么并行执行CPU密集型任务,例如两个信号的互相关,多处理模块是最好的模块吗?

为了更具体,假设我要并行化的任务是以下代码中的 for 循环,而我的机器只有 12 个内核。假设我的模板的长度约为 1000,图像的长度约为 2000,并且我有 ~1000 个信号要排序:

import numpy as np

###2-D array of shape (points, signals)
signals = np.load('signals.npy')

###1-D template array for cross correlation
templateSignal = np.load('template.npy')

for s in range(signals.shape[2]):
    xcorr = np.correlate(templateSignal, signal[:,s])
4

1 回答 1

2

即使使用 GIL,Python 中的线程也很有用,因为输入/输出操作不会阻塞程序。您可以在等待磁盘操作完成或等待网络事件时执行操作。

线程也在 GUI 应用程序中发挥作用,程序可以在后台执行计算时保持对用户输入的响应(感谢@FogleBird)

至于 2),您的假设是正确的,您可以使用multiprocessing模块将 CPU 密集型程序传播到多个内核。请注意进程之间的通信成本。

于 2012-07-19T20:02:10.147 回答