Как использовать параллельную обработку для функции, работающей с пустым массивом, когда часть функции заключается в добавлении строк в массив и его обновлении? - PullRequest
0 голосов
/ 24 января 2019

Код, который у меня ниже, прекрасно работает.

Но я хочу изменить следующее: если «переменная», которую я имею, больше 0, я хочу добавить строку, например [0,1,0,0], в существующий массив, а затем функция и параллельная обработка работают в этом обновленном массиве.

Я записал код, который уже пробовал ниже.

Я получаю сообщение об ошибке: «IndexError: индекс 2 выходит за пределы оси 0 с размером 2».

В сообщении также говорится, что это прямая причина этой строки:

master_array = np.vstack ((pool.map (third_three_part_function, array)))

import numpy as np
import multiprocessing

array = np.zeros((4, 4))
for i in range(np.size(array,1)):
    array[i,0] = 10

def third_three_part_function(array):
    for i in range(np.size(array) - 1):     
        variable = (np.random.poisson( 1, 1))       
        array[i+1] =array[i ]+ variable     
    return(array)

from multiprocessing import Pool

if __name__ == '__main__':
    pool = Pool(processes=2)
    master_array = np.vstack((pool.map(third_three_part_function, array)))
    print(master_array)

#### What I've already tried, but doesn't work:
    for i in range(np.size(array) - 1):     
            variable = (np.random.poisson( 1, 1))       
            array[i+1] =array[i ]+ variable 
        if variable>0:
                addition = [0,1,0,0]
                array = np.vstack([array,addition])
    return(array)

Цель состоит в том, чтобы для каждой новой строки, которую я добавляю в массив, функция и параллельная обработка также работали с этими новыми строками, а не только с исходными строками массива.

1 Ответ

0 голосов
/ 24 января 2019

Когда вы используете Pool.map для запуска функции над массивом, ваша функция запускается параллельно в двух процессах (в данном случае).Каждый из этих двух процессов имеет копию из array.

Что бы вы ни делали с массивом в одном процессе, не меняет массива в другом процессе!Он также не влияет на массив в родительском процессе, который вызывает Pool.map!

Так что для правильной работы Pool.map ваша рабочая функция должна принимать один аргумент (это может быть список или кортеж,хоть).Он работает с этим аргументом, а затем возвращает результат .Затем модуль multiprocessing отправляет этот результат обратно в родительский процесс.Все эти возвращаемые значения собраны в список и возвращены Pool.map.

Например, предположим, что вы хотите посчитать количество слов в файлах.Вы вызываете Pool.map с рабочей функцией и списком имен файлов.Рабочая функция принимает одно имя файла в качестве аргумента.Он читает этот файл, считает слова и возвращает количество слов в этом файле.Таким образом, Pool.map возвращает список подсчетов слов, соответствующий списку заданных имен файлов.

Редактировать : Если вы не привязаны к numpy массивам, вы можете использовать разделяемую памятьв виде multiprocessing.Array.Но вам нужно подумать о том, как использовать это.При создании такого массива вы можете указать, должен ли он быть защищен блокировкой (по умолчанию).Это позволит сериализовать доступ к массиву и предотвратить повреждение памяти, но это покажет ситуацию.Другой вариант - не использовать блокировку.Но в этом случае вы должны предотвратить повреждение памяти.

Например, допустим, у вас есть массив из 100 чисел, и вы хотите использовать два процесса.Затем вы должны запрограммировать вашу рабочую функцию для получения аргумента смещения.Первый рабочий получает смещение 0 и работает только с элементами массива от 0 до 49. Второй рабочий получает смещение 50 и работает только с элементами от 50 до 99. Если вы сделаете это так, вы сможете использовать общую память без блокировок ибез повреждения памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...