轻松多线程

日期2008-03-22(最后修改),2007-04-18(创建)

Python 包含一个多线程包“threading”,但 Python 的多线程受到全局解释器锁的严重限制,该锁一次只允许一个线程与解释器交互。对于纯解释代码,这使得多线程实际上是协作的,无法利用多核优势。

然而,numpy 代码在计算时通常会释放 GIL,因此简单的并行化可以加速代码。对于复杂的应用程序,应该考虑使用 MPI 或直接使用线程,但令人惊讶的是,应用程序通常是“尴尬并行”的,也就是说,只需要对许多对象执行相同的操作,并且迭代之间没有交互。这种计算可以轻松地并行化。

在 [ ]
dft = parallel_map(lambda f: sum(exp(2.j*pi*f*times)), frequencies)

实现 parallel_map 的代码并不复杂,并附在该条目中。如果不想返回值,则更简单。

在 [ ]
def compute(n):
    ...do something...
foreach(compute, range(100))

这将替换 for 循环。

有关代码(由 AMArchibald 编写)的附件,请参见 [[AttachList]]。

另请参见 ParallelProgramming 以获取替代方案和更多讨论。

章节作者:AMArchibald、DavidLinke

附件