2012-07-19 52 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