我在Python中使用多处理变得有点疯狂。 让我简单解释一下。
我有一个图像目录。图像是内部类别。我每个类别总共有10个类别和数十个图像。
简而言之,我的程序的目标是每个类别随机拍摄三张图像并进行大量计算,十次对应十个不同的参数。
程序效果很好,但需要时间。这就是为什么我想使用多处理来并行化它。
目的是能够使用我的10个核心,在每个核心中使用一个参数进行计算。
我有一个很大的函数,有两个for循环。
这里是主文件:
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
所以程序正在运行,但是在第一个循环结束时,我有一条弹出消息说&#34; Python突然崩溃&#34;。这些计划继续运行。
我注意到一些可能会让你对我的问题有所暗示的事情。
对于绘图部分,我使用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 :(得分:0)
我疯了但终于找到了解决方案。
事实证明,我需要在导入Matplotlib之后添加以下行:
matplotlib.use('Agg')
我曾经只在服务器上激活此行,因为它没有用于绘图的显示,但是当我进行一些并行化时,似乎我还需要激活此行。
现在有效!