2015-11-18 33 views
0

我對如何多線程Python 2.7應用程序感到困惑。不確定如何在Python中處理複雜函數的多線程問題

我在下面包含了一個簡化版本的代碼。本質上,迭代項目列表並調用函數。函數「edit_file」不是CPU或硬盤驅動器激烈,不會返回值並編輯獨立文件。也就是說,沒有兩個函數編輯同一個文件。

因爲這樣的應用程序可以使用多個線程。

複雜性是必須使用不同的一組參數,具體取決於項目的內容。此外,這組參數也發生變化,本身也是另一個函數的輸出。

items = ['alpha', 'bravo', 'charlie', ... , 'zulu'] 

for item in items: 
    if func(item) == 'a': 
     edit_file(item, parameter_set1) 
    else func(item) == 'b': 
     function(item, parameter_set2) 
     if another_variable > 0: 
      edit_file(item, parameter_set3) 

如何多線程這樣的應用程序?

+0

注意,多線程IM Python通常不是CPU核心上的多線程,它們仍然會在CPU中佔用一個核心(線程)。您在這裏獲得的唯一一件事是您的「並行代碼執行」。 – Torxed

回答

0

我假設edit_file因爲它的名字而被IO綁定,所以它成爲Python多線程的候選對象。 CPU綁定計算不會,因爲Python使用全局解釋器鎖,一次只允許一個線程在Python進程中處於活動狀態 - 但另一個線程可以在IO中阻塞時運行。

你可以使用工作線程這裏的游泳池:

from multiprocessing.pool import ThreadedPool 

def process(item): 
    if func(item) == 'a': 
     edit_file(item, parameter_set1) 
    else func(item) == 'b': 
     function(item, parameter_set2) 
     if another_variable > 0: 
      edit_file(item, parameter_set3) 

nThreads = 8 # number of concurrent threads 
pool = ThreadedPool(nThreads) 

pool.map(process, items) 
pool.close() 

(我一直在你的代碼在過程中保持不變,即使我認爲function應該是edit_file ...)