2015-04-28 17 views
4

我在Python中有一些字符串處理作業。我希望通過使用線程池來加快 的工作速度。字符串處理作業不依賴於其他每個 。結果將被存儲到一個mongodb數據庫中。來自multiprocessing.pool的Python ThreadPool無法利用所有CPU

,我寫我的代碼如下:

thread_pool_size = multiprocessing.cpu_count() 
pool = ThreadPool(thread_pool_size) 
for single_string in string_list: 
    pool.apply_async(_process, [single_string ]) 
pool.close() 
pool.join() 

def _process(s): 
    # Do staff, pure python string manipulation. 
    # Save the output to a database (pyMongo). 

我嘗試在Linux機器有8個CPU內核運行代碼。事實證明, 最高CPU使用率只能在130%左右(從頂部讀取),當我 運行幾分鐘的工作。

我的方法是否正確使用線程池?有沒有更好的方法來做到這一點?

+0

您是使用內置的'multiprocessing'模塊還是單獨的模塊? – 101

+0

內建於Python 2.7中。謝謝 –

+0

我刪除了MongoDB標記有兩個原因:首先,顯示的代碼與它無關。其次,這個問題針對的是Pythons的多處理功能。請不要將您的整個堆棧添加到標籤。 –

回答

2

或許_process不受CPU限制;如果你正在寫數據庫,它可能會被文件系統或網絡放慢。你可以看到,如果CPU使用率上升,如果你讓你的過程真正做到CPU限制,例如:

def _process(s): 
    for i in xrange(100000000): 
     j = i * i 
+0

我使用這個函數,發現CPU使用率現在上升到300%左右,這要好得多。但是,我可以增加更多嗎? 8核CPU的理論極限是800%吧? –

1

您可能會檢查使用多個進程,而不是多線程。 Here是一個很好的比較兩個選項。在其中一個評論中指出,Python 不能夠在使用多個線程時使用多個CPU(由於全局解釋器鎖定),因此不能使用多個CPU。因此,不應使用線程池,而應使用進程池來充分利用您的機器。

+0

我曾經認爲ThreadPool使用進程池在Python中實現,因爲它在多處理包中。但是當我用進程池替換線程池後,速度增加了很多。我會做更多的研究,並可能會更新問題,如果我有新的發現。謝謝。 –