Получение результатов из pool.map () pathos - PullRequest
0 голосов
/ 19 марта 2020

Я пытался создать мою проблему в коде ниже:

import numpy as np
from pathos.multiprocessing import ProcessPool
import multiprocessing
shapes_to_display=[]
products =[ 0,1,2,3,4,5,6,7,8,9]

def hay(i):
    print('PROCESSOR ID: ', multiprocessing.current_process().pid, 'Iteration: ', i)
    product = products[i]
    shapes_to_display.append([i, product])
    return shapes_to_display

pool = ProcessPool(nodes=4)
res= pool.map(hay, range(len(products)))

pool.close()
pool.restart()

res = np.asarray(res)
print(res.shape)

for r in res:
    r = np.asarray(r)
    print(r)

В результате я хочу получить:

(10,) [[ 0 0], [1,1], .. .. .. [9,9]]

Что я получаю в итоге:

(10,) [[0 0]] [[1 1]] [[2 2]] [[3 3]] [[0 0] [4 4]] [[1 1] [5 5]] [[2 2] [ 6 6]] [[3 3] [7 7]] [[0 0] [4 4] [8 8]] [[1 1] [5 5] [9 9]]

Может ли кто-нибудь из вас помочь мне понять это? Что мне нужно сделать, чтобы получить результат так, как я хочу?

1 Ответ

0 голосов
/ 20 марта 2020

Q : «Что мне нужно сделать, чтобы получить результат так, как я хочу?»

Вам нужно первый понять игрушки и его механика

Процессо-распределенные вычисления, распределенные по пафосу, не «равномерно» делятся переменные "через" все удаленные процессы (скорее происходит совершенно противоположное и правильное из-за разделения этих отдельных процессов, центральное и все распределенные GIL-блокировка -ы становятся и остаются независимыми и могут свободно выполнять вычисления без ожидания в ином неисключаемом интерпретаторе python [SERIAL] - очередь работает, но ждет своей очереди в избежание -конкурентность - безопасная, но ужасно неэффективная последовательность всех ожиданий, но каждый выполняет небольшую работу, если это ее очередь, в бесконечная очередь ожидания GIL-блокировки One_step - после - Другой _step - после - Another_step -...

Пафос помог вам сократить этот чистый - [SERIAL] цепочка ALL -wit -but- (просто) один (и только один) - работает .

Обрезка (путем отправки некоторой работы в полностью независимые процессы) также означает, что эти процессы не знают ничего, кроме состояния оригинала (основной) процесс python во время их создания (да, они были созданы полной копией исходного интерпретатора python, включая все его внутреннее состояние - то есть все import, а также все структуры данных полностью копируются в стадо новых копий процессов).

Это помогает выполнить некоторую серьезную работу, но это довольно дорого для всей этой тяжелой артиллерийской работы в тех случаях, когда лишь немногие этапы вычислений выполняются на дальнем конце выполнения кода удаленного процесса - такие варианты использования никогда не оправдывают затраты на добавление s, которые были сожжены для того, чтобы это произошло.

Тем не менее, независимость процесса также означает, что нет никакого способа (если не запрограммировано явно), что любой независимый процесс когда-либо услышит о присвоении переменной в любом другом из (все еще независимых процессов).

Таким образом, выполнение .append() всегда является проблемой, если модификация удаленных копий переменной, созданной в главном интерпретаторе, до того, как процессы скопируют ее в удаленный - независимые -инстанции.

Сделайте return [i, product] в hay(i), и pool.map() соберет эти соответствующие результаты в нужную вам форму и форму.

...