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 分は加算されない

0 件のコメント:

コメントを投稿