2012-07-19 53 views
3

1)我读过如果我在python中导入线程模块,使用这个库的CPU绑定加载看不到太多好处,因为GIL强制线程在即使我在多核机器上运行代码也是如此。如果是这种情况,那么使用Python的线程库会使哪些代码受益? 2)如果线程库就是这种情况,那么并行执行CPU密集型任务(例如两个信号的交叉关联)是多处理模块最适合使用的模块吗?使用线程/线程模块的好处python 2.7

为了使这个更具体一些,让我们说我想要并行化的任务是以下代码中的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]) 
+0

你有基准吗? – 2012-07-19 19:59:40

+0

注意:C扩展可以释放GIL,但它们不会触摸Python对象,例如,某些numpy函数会释放GIL。 – jfs 2012-07-19 20:36:34

回答

2

即使在GIL,在Python线程是因为输入/输出操作有用不要阻止该程序。您可以在等待完成磁盘操作或等待网络事件时执行操作。

线程也发挥了GUI应用程序的作用,其中,同时在背景(感谢@FogleBird)

至于2)进行计算的程序可以留响应用户输入,你在你的假设是正确的,你可以使用multiprocessing模块将CPU密集型程序传播到多个核心。了解流程之间的沟通成本。

+0

当您有GUI时,对后台任务也很有用,因此GUI保持响应。 – FogleBird 2012-07-19 20:12:27

+0

假设后台任务是IO操作,而不是CPU密集型操作,如矩阵乘法? – ncRubert 2012-07-19 20:24:14

+0

@ncRubert无法播放MP3并在播放期间暂停播放,而无需使用线程 - 在播放MP3时,UI会锁定 – 2012-07-19 20:31:18