2017-07-26 167 views
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 

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

谢谢

+0

在你的内循环中,有''object_list_category [1]'故意吗? – Peri461

+0

另外,让我提供一些建议,可能会导致您找到自己的错误。您似乎已经很好地掌握了多线程/并行处理的工作原理,但请记住,当您通过函数映射元素时,最好将其视为数据转换。该函数定义要应用的更改,并且可迭代是被更改为输出的输入。似乎你的函数可能试图迭代你的列表,但你应该让映射为你做... – Peri461

+0

@ Peri461是的,这是故意的。因为它是一个元组,我只想加入与我的图像相对应的第二个项目。 我明白你说了什么,但由于我已经有一个与我的参数相对应的迭代器,我会测试。如何执行我的函数内的两个循环? – lilouch

回答

0

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

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

matplotlib.use('Agg') 

我激活该行只在服务器上,因为它没有显示绘制,但似乎当我做一些并行化时,我需要激活这条线。

现在,它的工作原理!

相关问题