У меня вопрос о том, как использовать 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__'