2017-02-04 3 views
3

は、いくつかのいずれかを事前にジェネレータ機能を持つPythonマルチプロセッシングモジュールを使用する際にエラーが発生しました。

MaybeEncodingError Traceback (most recent call last) in() 5 p = Pool(2) 6 ----> 7 n = p.map(sq, range(10))

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py in map(self, func, iterable, chunksize) 258 in a list that is returned. 259 ''' --> 260 return self._map_async(func, iterable, mapstar, chunksize).get() 261 262 def starmap(self, func, iterable, chunksize=None):

/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py in get(self, timeout) 606 return self._value 607 else: --> 608 raise self._value 609 610 def _set(self, i, obj):

MaybeEncodingError: Error sending result: '[, ]'. Reason: 'TypeError("can't pickle generator objects",)'

感謝

from multiprocessing import Pool 
def sq(x): 
    yield x**2 
p = Pool(2) 

n = p.map(sq, range(10)) 

私は取得していますエラー、次の以下のコードと間違っているものを説明してもらえます。

+0

方法についてよりはるかに遅いことを示していることを、私は、リストを反復処理を強制し、私は

print(list(n)) 

注上記と同じ結果を得る値を消費(および実際の処理を活性化させる)ために、戻ってくる歩留まりを変える? – Shiping

+0

私は値の格納を避けようとしています。 – Manu

+0

yieldは値を保存しようとしますが、戻り値は値を返して忘れてしまいます。それでも収穫はうまくいかない。 – Shiping

答えて

4

ファンクションではなく、ジェネレータを使用する必要があります。手段:yieldreturnに変更してsqを関数に変換します。 Poolはジェネレータでは使用できません。

さらに、Windows上で動作するバージョンを作成しようとすると、私は奇妙な繰り返しのエラーメッセージが表示されました。

文字通り私が得たコメント、それは一目瞭然だから引用
Attempt to start a new process before the current process 
has finished its bootstrapping phase. 

This probably means that you are on Windows and you have 
forgotten to use the proper idiom in the main module: 

if __name__ == '__main__': 

the error on windows is because each process spawns a new python process which interprets the python file etc. so everything outside the "if main block" is executed again"

ので移植できるように、あなたはこのモジュールを実行するとき__name__=="__main__"を使用する必要があります。

from multiprocessing import Pool 

def sq(x): 
    return x**2 

if __name__=="__main__": 
    p = Pool(2) 
    n = p.map(sq, range(10)) 
    print(n) 

結果を:

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

編集:あなたが値を格納したくない場合は、事前にあなたは

n = p.imap(sq, range(10)) 

nimapは今ジェネレータオブジェクトで使用することができます。ドキュメントはimapmap

+0

私は値の格納を避けようとしています。 – Manu

+0

私の編集を参照してください。 –

+0

私は "if __name__ == '__main__'"を試しました。同じエラーです。 私は他の人の提案を待つでしょう、そうでなければ私は "返品"オプションを使用します。 – Manu

関連する問題