首页 > 解决方案 > 在进程 Python 之间交换对象

问题描述

以下代码检查是否通过进程在四面体列表中验证了某个属性。

运行方法

def process(tetrahedrons, startOfWork, endOfWork, RelativeResult):
    print("Start of the process", mp.current_process().name)
    result = False
    for c in range(startOfWork,endOfWork):
        for j in range(c+1,len(tetrahedrons)):
            if tetrahedrons[c].IsInterpenetrated(tetrahedrons[j]) == 1:
                result = True
    print("Relative result = ",result, end="\n\n")
    RelativeResult.put(result)

并行搜索方法

def parallelInterpenetrationSearchWithProcess(self, tetrahedrons):
    
    '''
    parallel verification of the existence
                          of an interpenetration between tetrahedra
    '''
    time_start = datetime.datetime.now()

    N_CORE = mp.cpu_count()
    Workers = []
    QuantityForWorker = int(len(tetrahedrons) / N_CORE)
    Rest = len(tetrahedrons) % N_CORE
    StartWork = 0

    if QuantityForWorker == 0:
        iterations = Rest -1
    else:
        iterations = N_CORE

    for i in range(iterations):
        EndWork = StartWork + QuantityForWorker
        if i < Rest -1:
            EndWork = EndWork + 1
        IdWork = i
        Workers.append( mp.Process( target = process,
                                    args   = ( tetrahedrons,
                                               StartWork,
                                               EndWork,
                                               output
                                               )
                                    )
                        )
        Workers[IdWork].start()
        StartWork = EndWork

    for worker in Workers:
            worker.join()
            
    while not(RelativeResult.empty()):
        if RelativeResult.get():
            print( "Parallel search took %f seconds" %
                   ( timeelapsed( time_start ) )
                   )
            return True
    print( "Parallel search took %f seconds" %
           ( timeelapsed( time_start ) )
           )
    return False

它适用于输入数组“四面体”的小尺寸,但是它给我带来了问题,因为后者的更高维度会惨遭失败。我认为这是因为每次我去创建一个进程时,它都会在内存中创建一个副本,其中包含所有可用的当前参数。您知道将 168,000 个元素的数组复制 4、5、6 或 8 次并不是一件好事。所以我正在寻找一种在我可以使用的所有进程之间共享这个数组的方法。我已经看到了可以通过共享内存的帮助来利用的各种方法multiprocessing.sharedctypes.RawArray,使用multiprocessing.Queue()-instance,但我无法从中获得任何好处。


总结:

如何共享一个数组,以便它可以被不同的进程读取,而后者不必在本地创建自己的实例?

如果您不明白,请不要犹豫。

标签: pythonparallel-processingmultiprocessingpython-multiprocessing

解决方案


推荐阅读