誰かが以下のコードの何が問題になっているのか説明できますか
from multiprocessing import Pool
def sq(x):
yield x**2
p = Pool(2)
n = p.map(sq, range(10))
次のエラーが発生します
MaybeEncodingError Traceback(最後の最後の呼び出し)in()5 p = Pool(2)6 ----> 7 n = p.map(sq、range(10))
返されるリスト内のmap(self、func、iterable、chunksize)258の/home/devil/anaconda3/lib/python3.4/multiprocessing/pool.py。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 609610 def _set(self、i、 obj):
MaybeEncodingError:結果の送信中にエラーが発生しました: '[、]'。理由: 'TypeError( "ジェネレータオブジェクトをピクルできません"、)'
よろしくお願いします。
ここでは、ジェネレータではなく関数を使用する必要があります。手段:関数に変換するために変更します。ジェネレーターでは動作しません。yield
return
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__':
それは自明なので、私が得たコメントを文字通り引用します:
Windowsでのエラーは、各プロセスがpythonファイルなどを解釈する新しいpythonプロセスを生成するため、「ifmainblock」以外のすべてが再度実行されるためです。
したがって、移植可能にするために、__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]
編集:事前に値を保存したくない場合は、次を使用できます imap
n = p.imap(sq, range(10))
n
はジェネレータオブジェクトになりました。値を消費する(そして実際の処理をアクティブにする)ために、リストを強制的に反復すると、上記と同じ結果が得られます。
print(list(n))
ドキュメントはそれimap
がよりもはるかに遅いことを示していることに注意してくださいmap
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加