多处理Python - Python突然退出,但程序仍在继续



我对在Python中使用多处理有点疯狂。 让我简要解释一下。

我有一个图像目录。图像是内部类别。我总共有十个类别,每个类别有几十张图片。

简而言之,我的程序的目标是为每个类别随机拍摄三张图像并执行大计算,十次对应于十个不同的参数。

这些程序运行良好,但需要时间。这就是为什么我想使用多处理来并行化它。

目标是能够使用我的 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

所以程序正在工作,但在第一个循环结束时,我有一个弹出消息说"Python 突然崩溃"。程序将继续运行。

我注意到一些事情可能会给你一个关于我的问题的提示。

  • 如果我评论绘图部分,它可以工作
  • 我让绘图部分,我的程序在该类别的前三个对象之后停止,并继续使用相同的三个对象。就像我的第一个循环无限期地卡在拳头项目上一样。

对于绘图部分,我使用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

你能帮忙吗?我做错了什么吗?

谢谢

我疯了,但最终我找到了解决方案。

事实证明,我需要在导入 Matplotlib 后添加以下行:

matplotlib.use('Agg')

我以前只在服务器上激活这条线,因为它没有用于绘图的显示器,但似乎当我进行一些并行化时,我也需要激活这条线。

现在它工作了!

相关内容

  • 没有找到相关文章

最新更新