2009-02-11 67 views
2

我知道Python有一個global lock,我讀過了Glyph的python multithreading的解釋。但我仍然想嘗試一下。我決定做一個簡單的(概念上的)任務是對圖片進行水平和垂直邊緣檢測。Python中的線程練習

這裏發生了什麼(僞):

for pixels in picture: 
    apply sobel operator horizontal 
for pixels in picture: 
    apply sobel operator vertical 

info on sobel operator

這兩個循環可以完全獨立運行,因此會成爲多線程的主要候選對象。 (在任何非常大的圖片上運行這兩個循環可能需要10秒以上)。但是,當我嘗試在python中使用threading模塊時,由於全局鎖定而需要兩倍的時間。我的問題是,我是否應該放棄所有希望在python的兩個線程中執行此操作並嘗試使用另一種語言?如果我可以開拓進取,我應該使用哪些模塊?如果不是,我應該用什麼語言進行實驗?

回答

7

Python 2.6現在包含mulitprocessing模塊(以前的老版本的Python爲processing模塊)。

它具有與線程模塊基本相同的界面,但將執行啓動到單獨的進程而不是線程。這使得Python可以利用多個內核/ CPU,並且與線程模塊方法相比,可以很好地擴展CPU密集型任務。

3

如果sobel運算符是CPU綁定的,那麼您將不會從多個線程中獲益,因爲python沒有利用多個內核。

可以想象,您可以分離多個進程,但我不確定這對於處理單個映像是否可行。

10秒似乎沒有太多時間浪費。如果您擔心時間,因爲您將處理許多圖像,那麼運行多個進程並使每個進程處理單獨的圖像子集可能更容易。

+0

多處理/處理模塊爲您處理多個進程和IPC,並且允許比CPU密集型任務的傳統Python線程更好地擴展。 – Jay 2009-02-11 04:11:52

0

像索貝爾操作員那樣的大規模矩陣操作將通過(正確地)使用Matlab/Octave確實實現顯着的速度增益。 NumPy可能會爲矩陣/陣列操作提供類似的加速。

2

我推薦使用NumPy。它不僅會更快,而且如果你使用它的線程,將不會有全局鎖。

我也會建議像Jay所說的那樣使用多處理技術。不管怎麼說,如果你真的想練習穿線,我會建議你用C中的PThreads來玩。PThreads對於基本的例子來說非常簡單,並且可以在整個地方使用。

0

如果你想用Python練習並行編程,Python多處理是正確的選擇。如果您沒有Python 2.6(如果您使用的是Ubuntu,那麼您不需要),那麼您可以使用Google code backported版本的多處理。它是PyPI的一部分,這意味着您可以使用EasyInstall(它是Ubuntu中的python-setuptools軟件包的一部分)輕鬆安裝它。