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