WindowsのPython 3.5では、入力に適用される関数でいくつかの事前処理された変数を使用する必要があるマルチプロセッシングコードを設計しようとしています。
これらの変数を使用できるようにするには、それらをグローバル変数として扱います。Python - マルチプロセッシングコールの前に変更されたグローバル変数が元の状態として渡される
これは非並列アプローチで動作しますが、multiprocessing.Pool
を使用すると、グローバルが初期化から変更されていない場合に発生する動作が示されます。
は、次のコードを検討:
from multiprocessing import Pool
testlist = []
def f(x):
return x*x + testlist[0]
def main():
global testlist
input_iter = range(10)
testlist = [1, 2, 3, 4, 5]
for i in input_iter:
print(f(i))
with Pool(2) as pool:
for i in pool.imap_unordered(f, input_iter):
print(i)
if __name__ == '__main__':
main()
単に機能f(x)
正方形の入力を、グローバル変数testlist
から要素を追加します。 testlist
は、最初はグローバルに空のリストとして定義され、main()
関数内にリスト[1, 2, 3, 4, 5]
を含むように変更されます。このコードを実行する
は、単純なfor
ループに対する所望の出力を生成しますが、マルチプロセッシングループがIndexError
スローされます。Pool
労働者に、testlist
変数に値を含むように改変し、まだ空のリストですされていませんが。
1
2
5
10
17
26
37
50
65
82
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "\lib\multiprocessing\pool.py", line 119, in worker
result = (True, func(*args, **kwds))
File "progresstest.py", line 7, in f
return x*x + testlist[0]
IndexError: list index out of range
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "progresstest.py", line 21, in <module>
main()
File "progresstest.py", line 17, in main
for i in pool.imap_unordered(f, input_iter):
File "\lib\multiprocessing\pool.py", line 695, in next
raise value
IndexError: list index out of range
グローバル変数
前Pool
労働者のいずれかの創造に変更され、単純なループは、この割り当てが働いていることを示しています。何
IndexError
は
for
ループにスローされません。プロセス間で状態を共有することはできませんが、この変数は並列実行の前に定義されており、変更されません。
どうしてですか? UNIXのようなオペレーティングシステムで
これはPython 2または3ですか? –
ここに投稿したコードをファイルに入れてPython 3で実行すると、期待どおりに動作します。コードを単純化して質問を投稿する際に、実際に問題の原因となっているビットを削除することも可能ですか? –
あなたはWindows上にいるように聞こえます。マルチプロセッシングは、あなたが思うように動作しません。グローバル変数は、プロセス間でデータを共有する安全な方法ではありません。 – user2357112