3

multiprocessing.Poolこの状況での Python の動作がわかりません。

import multiprocessing

def f(x): return x
P = multiprocessing.Pool()
def f(x): return x*x

print (P.map(f, range(10)))
print (  map(f, range(10)))

出力は次のようになります。

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

print ステートメントが呼び出される時点で、単一のf. Pool が の最初のインスタンスを取得するのはなぜfですか? 私はそれを期待しP.mapmap同じ結果を出力するでしょう!

4

1 に答える 1

3

これは素晴らしい質問であり、一般的にスレッディング (およびマルチプロセッシング) についてより多くの知識/経験を持つ人が来て、より良い答えを出すことを願っていますが、ここに私の試みがあります:

ここで詳細を掘り下げることなく (ソースをざっと見てから)、Poolコンストラクターがタスクのキューを処理するために複数のスレッドを生成しているように見えます。それらのスレッドは、それらに入れるものを探しているだけのようです。そのため、スレッドが function__main__.fの実行要求を受け取ると、実行されるように見えますが、 の更新された定義が見られないため__main__.f、古い定義が使用されます。

于 2012-08-24T14:58:30.903 に答える