Обмен объектами между процессами Python

#python #parallel-processing #multiprocessing #python-multiprocessing

#python #параллельная обработка #многопроцессорная обработка #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="nn")
    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 , используя a multiprocessing.Queue() -instance , но я не смог извлечь из этого ничего хорошего.


В заключение:

Как я могу совместно использовать массив, чтобы он мог быть прочитан различными процессами без необходимости создания последним собственного экземпляра локально?

Если вы не понимаете, не стесняйтесь спрашивать.

Комментарии:

1. Честно говоря, это конец строки, насколько Python идет. Если вы хотите оптимизировать на этом уровне, вам нужно использовать язык более низкого уровня. То, что вы хотите, — это многопоточность (которая явно разделяет память), что не дает преимуществ в производительности в Python, но дает на других языках.

2. Я думал, что multiprocessing.Manager() для этого используется?

3. @orlp На самом деле я выбрал точечные процессы, потому что мне стало известно об ограничениях python в использовании потоков. Я пытался использовать многопроцессорную обработку. Manager ()», но он выдает мне следующую ошибку «Ошибка рекурсии: превышена максимальная глубина рекурсии при травлении объекта». Я думаю, что проблема связана с количеством используемых входных данных.