Как использовать результаты урожайности с пулом в многопроцессорной обработке? - PullRequest
0 голосов
/ 30 января 2019

У меня вопрос о том, как использовать yield для параллельного размещения большой симметричной матрицы.Поскольку каждый элемент обрабатывается относительно быстро, лучший способ, которым я нашел его, был параллелизм каждой строки.

Ниже приведен краткий пример проблемы, с которой я столкнулся при использовании yield с imap_unordered..

import multiprocessing as mp
import random
import numpy as np

def func(param):
    i, js = param
    for j in js:
        yield i,j,random.random()

N=100
M = np.eye(N, dtype=np.float)
params_parallel = [ (i, range(i)) for i in range(N) ]

with mp.Pool(processes=4) as p:
    for (i,j,value) in p.imap_unordered( func, params_parallel ):
        M[i,j] = M[j,i] = value 

У меня следующий результат:

Traceback (most recent call last):
  File "test_parallel.py", line 15, in <module>
    for (i,j,value) in p.imap_unordered( func, params_parallel ):
  File "/usr/lib/python3.6/multiprocessing/pool.py", line 761, in next
    raise value
multiprocessing.pool.MaybeEncodingError: Error sending result: '<generator object func at 0x7fb6ae377780>'. Reason: 'TypeError("can't pickle generator objects",)'

пс .: Я не могу использовать:

if __name__ == '__main__'
...