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
你能幫忙嗎?我做錯什麼了嗎 ?
謝謝
在你的內循環中,有''object_list_category [1]'故意嗎? – Peri461
另外,讓我提供一些建議,可能會導致您找到自己的錯誤。您似乎已經很好地掌握了多線程/並行處理的工作原理,但請記住,當您通過函數映射元素時,最好將其視爲數據轉換。該函數定義要應用的更改,並且可迭代是被更改爲輸出的輸入。似乎你的函數可能試圖迭代你的列表,但你應該讓映射爲你做... – Peri461
@ Peri461是的,這是故意的。因爲它是一個元組,我只想加入與我的圖像相對應的第二個項目。 我明白你說了什麼,但由於我已經有一個與我的參數相對應的迭代器,我會測試。如何執行我的函數內的兩個循環? – lilouch