2017-07-26 62 views
1

我對在Python中使用多處理變得有點瘋狂。 讓我簡單解釋一下。多處理Python - Python突然退出,但程序仍然繼續

我有一個圖像目錄。圖像是內部類別。我每個類別總共有十個類別和幾十個圖像。

簡而言之,我的程序的目標是隨機抽取三個圖像並執行大計算,十次對應十個不同的參數。

程序運行良好,但需要時間。這就是爲什麼我想使用多處理來並行化它。

目的是爲了能夠使用我的10個內核,在每個內核中使用一個參數進行計算。

我有一個很大的函數,它有兩個for-loop。

這裏主要文件:

def main(): 
    #Array which contains the 10 parameters to tests 
    parameters = ['param1','param2',...,'param10'] 
    pool = mp.Pool(processes=2) #I put a small number in purpose 
    params = (list_of_random_objects, trained_dataset, name_dataset) 
    #List of randoms objects is an array [('category_i', ['path_image_1', 'path_image_2','path_image_2'])] 
    #trained_dataset is a path and name_dataset is the name of the dataset 
    func = partial(automatic_processing, params) 
    pool.map(func, parameters) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

這裏大功能(我讓最重要的部分):

def automatic_processing(params,name_parameter): 
    list_of_random_objects, trained_dataset, name_dataset = params 

    #First loop : for each category 
    for idx, object_list_category in enumerate(list_of_random_objects): 
     print("\n =====> Processing current category : {} <===== ".format(object_list_category[0])) 

     #Second loop : for each objects of the current category 
     for obj in object_list_category[1]: 
      print("\n ###### Processing current OBJECT : {} \n".format(obj)) 

      #Do some processing (Big computation which take a lot of times) 

     ///CRASH HERE 
     #Drawing result second loop with matplotlib 

    #Drawing result first loop with matplotlib 

所以程序的工作,但在第一圈結束時,我有一個彈出消息,說「Python突然崩潰」。這些程序繼續運行。

我注意到一些可能會給我提示的問題。

  • 如果我評論的繪圖部分,它的工作原理
  • 據我讓繪圖部分,我的節目類別的前三OBJETS後停止,並繼續使用相同的三個對象。這就像我的第一個循環無限期地停留在第一個項目上。

對於繪圖部分,我使用Matplotlib。

這裏的錯誤,我從報告中獲得。

Exception Type:  EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes:  KERN_INVALID_ADDRESS at 0x0000000000000110 
Exception Note:  EXC_CORPSE_NOTIFY 

Termination Signal: Segmentation fault: 11 
Termination Reason: Namespace SIGNAL, Code 0xb 
Terminating Process: exc handler [0] 

VM Regions Near 0x110: 
--> 
    __TEXT     0000000102081000-0000000102083000 [ 8K] r-x/rwx SM=COW /usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/Resources/Python.app/Contents/MacOS/Python 

Application Specific Information: 
*** multi-threaded process forked *** 
crashed on child side of fork pre-exec 

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 
0 libdispatch.dylib    0x00007fff94c8c041 _dispatch_root_queue_push_override + 204 
1 libxpc.dylib     0x00007fff94f097ae _xpc_connection_activate_if_needed + 227 
2 libxpc.dylib     0x00007fff94efc5ba xpc_connection_resume + 64 
3 com.apple.CoreFoundation  0x00007fff7f6913fb -[_CFXPreferences _copyDaemonConnectionSettingUpIfNecessaryForRole:] + 427 
4 com.apple.CoreFoundation  0x00007fff7f691487 -[_CFXPreferences withConnectionForRole:performBlock:] + 23 
5 com.apple.CoreFoundation  0x00007fff7f6619f7 __80-[CFPrefsSearchListSource alreadylocked_generationCountFromListOfSources:count:]_block_invoke + 199 
6 com.apple.CoreFoundation  0x00007fff7f661842 -[CFPrefsSearchListSource alreadylocked_generationCountFromListOfSources:count:] + 226 

你能幫忙嗎?我做錯什麼了嗎 ?

謝謝

+0

在你的內循環中,有''object_list_category [1]'故意嗎? – Peri461

+0

另外,讓我提供一些建議,可能會導致您找到自己的錯誤。您似乎已經很好地掌握了多線程/並行處理的工作原理,但請記住,當您通過函數映射元素時,最好將其視爲數據轉換。該函數定義要應用的更改,並且可迭代是被更改爲輸出的輸入。似乎你的函數可能試圖迭代你的列表,但你應該讓映射爲你做... – Peri461

+0

@ Peri461是的,這是故意的。因爲它是一個元組,我只想加入與我的圖像相對應的第二個項目。 我明白你說了什麼,但由於我已經有一個與我的參數相對應的迭代器,我會測試。如何執行我的函數內的兩個循環? – lilouch

回答

0

我瘋了,但最終我找到了解決方案。

事實證明,我需要在導入後添加此以下行Matplotlib:

matplotlib.use('Agg') 

我激活該行只在服務器上,因爲它沒有顯示繪製,但似乎當我做一些並行化時,我需要激活這條線。

現在,它的工作原理!

相關問題