Как использовать многопроцессор Python Pool.map для заполнения массива numpy в цикле for

Я хочу заполнить массив 2D-numpy в цикле for и закрепить вычисление с помощью многопроцессорности.

import numpy from multiprocessing import Pool array_2D = numpy.zeros((20,10)) pool = Pool(processes = 4) def fill_array(start_val): return range(start_val,start_val+10) list_start_vals = range(40,60) for line in xrange(20): array_2D[line,:] = pool.map(fill_array,list_start_vals) pool.close() print array_2D 

Эффект его выполнения заключается в том, что Python запускает 4 подпроцесса и занимает 4 ядра процессора, но выполнение не заканчивается, и массив не печатается. Если я попытаюсь записать массив на диск, ничего не произойдет.

Может ли кто-нибудь сказать мне, почему?

  • Multiprocessing.Pool делает матричное умножение Numpy медленнее
  • Использование памяти продолжает расти с помощью многопроцессорной системы Python.
  • Как передать ссылку на очередь на функцию, управляемую пулом.map_async ()?
  • python multiprocessing.Pool kill * специфический * длительный или зависающий процесс
  • Получают ли многопроцессорные пулы каждый процесс одинаковое количество задач или назначаются ли они доступными?
  • передача аргументов и manager.dict для объединения в многопроцессорность в python 2.7
  • Многопроцессорность Python map_async генерирует ошибку в Windows
  • Python Pulp с использованием матриц
  • 3 Solutions collect form web for “Как использовать многопроцессор Python Pool.map для заполнения массива numpy в цикле for”

    Если вы все еще хотите использовать заполнение массива, вы можете использовать pool.apply_async вместо pool.map . Работая от ответа Саулло:

     import numpy as np from multiprocessing import Pool def fill_array(start_val): return range(start_val, start_val+10) if __name__=='__main__': pool = Pool(processes=4) list_start_vals = range(40, 60) array_2D = np.zeros((20,10)) for line, val in enumerate(list_start_vals): result = pool.apply_async(fill_array, [val]) array_2D[line,:] = result.get() pool.close() print array_2D 

    Это немного медленнее, чем map . Но он не создает ошибку времени выполнения, как мой тест версии карты: Exception RuntimeError: RuntimeError('cannot join current thread',) in <Finalize object, dead> ignored

    Следующие работы. Во-первых, это хорошая идея, чтобы защитить основную часть вашего кода внутри основного блока, чтобы избежать странных побочных эффектов. Результат poo.map() – это список, содержащий оценки для каждого значения в iterator list_start_vals , так что вам не нужно создавать array_2D раньше.

     import numpy as np from multiprocessing import Pool def fill_array(start_val): return list(range(start_val, start_val+10)) if __name__=='__main__': pool = Pool(processes=4) list_start_vals = range(40, 60) array_2D = np.array(pool.map(fill_array, list_start_vals)) pool.close() # ATTENTION HERE print array_2D 

    возможно, у вас возникнут проблемы с использованием pool.close() , из комментариев @hpaulj вы можете просто удалить эту строку, если у вас есть проблемы …

    Проблема заключается в запуске цикла pool.map in for. Результат метода map () функционально эквивалентен встроенной карте (), за исключением того, что отдельные задачи выполняются параллельно. поэтому в вашем случае pool.map (fill_array, list_start_vals) будет называться 20 раз и запускается параллельно для каждой итерации цикла for, Ниже код должен работать

    Код:

     #!/usr/bin/python import numpy from multiprocessing import Pool def fill_array(start_val): return range(start_val,start_val+10) if __name__ == "__main__": array_2D = numpy.zeros((20,10)) pool = Pool(processes = 4) list_start_vals = range(40,60) # running the pool.map in a for loop is wrong #for line in xrange(20): # array_2D[line,:] = pool.map(fill_array,list_start_vals) # get the result of pool.map (list of values returned by fill_array) # in a pool_result list pool_result = pool.map(fill_array,list_start_vals) # the pool is processing its inputs in parallel, close() and join() #can be used to synchronize the main process #with the task processes to ensure proper cleanup. pool.close() pool.join() # Now assign the pool_result to your numpy for line,result in enumerate(pool_result): array_2D[line,:] = result print array_2D 
    Python - лучший язык программирования в мире.