2012年10月9日火曜日
python - multiprocessing : Shared Memory
シェアするデータをパッケージ内のクラスとして作成し、Process の引数で渡す。
from multiprocessing import Process, Value, Array
procs = 3
count = 0 # グローバル変数はシェアされない
def showdata(label, val, arr):
msg = '%-12s: pid:%4s, global:%s, value:%s, array:%s'
print msg % (label, os.getpid(), count, val.value, list(arr))
def updater(val, arr):
global count
count += 1
val.value += 1
for i in range(3):
arr[i] += 1
if __name__ == '__main__':
scalar = Value('i',0)
vector = Array('d', procs)
showdata('parent start', scalar, vector)
p = Process(target=showdata, args=('child ', scalar, vector))
p.start()
p.join()
for i in range(procs):
count += 1
scalar.value += 1
vector[i] += 1
p = Process(target=showdata, args=('proc %s' % i, scalar, vector))
p.start()
p.join()
ps = []
for i in range(procs):
count += 1
scalar.value += 1
vector[i] += 1
p = Process(target=showdata, args=('proc %s' % i, scalar, vector))
p.start()
ps.append(p)
for p in ps:
p.join()
for i in range(procs):
p = Process(target=updater, args=(scalar, vector))
p.start()
p.join()
showdata('parent tmp', scalar, vector)
ps = []
for i in range(procs):
p = Process(target=updater, args=(scalar, vector))
p.start()
ps.append(p)
for p in ps:
p.join()
showdata('parent end', scalar, vector)
結果
parent start: pid:1468, global:0, value:0, array:[0.0, 0.0, 0.0]
child : pid:6496, global:0, value:0, array:[0.0, 0.0, 0.0]
proc 0 : pid:4480, global:0, value:1, array:[1.0, 0.0, 0.0]
proc 1 : pid:1776, global:0, value:2, array:[1.0, 1.0, 0.0]
proc 2 : pid:4896, global:0, value:3, array:[1.0, 1.0, 1.0]
proc 0 : pid:1436, global:0, value:6, array:[2.0, 2.0, 2.0]
proc 1 : pid:4008, global:0, value:6, array:[2.0, 2.0, 2.0]
proc 2 : pid:6352, global:0, value:6, array:[2.0, 2.0, 2.0]
parent tmp : pid:1468, global:6, value:9, array:[5.0, 5.0, 5.0]
parent end : pid:1468, global:6, value:12, array:[8.0, 8.0, 8.0]
proc * では global は常に 0
paremt tmp, parent end で global が 6 なのは main 内の count += 1 の影響で、Process の updater 分は加算されない
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿