3

このウェブサイトのどこかで次の例を見つけました。

import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10*10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)

# No copy was made
assert shared_array.base.base is shared_array_base.get_obj()

# Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i,:] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print shared_array

上記のコードは問題なく動作しますが、共有配列に配列を追加したい場合は、shared_array += some_other_array (上記の shared_array[i,;] = i の代わりに) のようなものを取得します。

代入前に参照されるローカル変数 'shared_array'

なぜ私はそれができないのですか?

4

1 に答える 1

6

変数が関数内のどこかに割り当てられている場合、それはローカル変数として扱われます。 shared_array += some_other_arrayと同等shared_array = shared_array + some_other_arrayです。したがってshared_array、ローカル変数として扱われます。これは、割り当ての右側で使用しようとした時点では存在しません。

グローバル変数を使用する場合は、関数shared_arrayにを入れて、グローバル変数として明示的にマークする必要がありglobal shared_arrayます。

でエラーが表示されない理由shared_array[i,:] = iは、これが変数に割り当てられていないためですshared_array。むしろ、それはそのオブジェクトを変更し、そのスライスに割り当てます。Pythonでは、裸の名前(eg、)への割り当ては、見た目は似ていますが、shared_array = ...他の種類の割り当て(eg、)とは大きく異なります。shared_array[...] = ...

ちなみに、エラーはマルチプロセッシングとは何の関係もないことに注意してください。

于 2012-07-11T22:40:35.320 に答える