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

时间:2017-07-26 13:59:27

标签: python multithreading multiprocessing

我在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
你可以帮忙吗?我做错了吗?

感谢

1 个答案:

答案 0 :(得分:0)

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

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

matplotlib.use('Agg')

我曾经只在服务器上激活此行,因为它没有用于绘图的显示,但是当我进行一些并行化时,似乎我还需要激活此行。

现在有效!