2017-06-01 14 views
1

私は2つの異なるプロセスによって配列の値を修正しようとしています。私はプロキシリストを使用して、私はそれを使用してドキュメントを読んだが、私はなぜdidntの仕事を知っていない。マルチプロセスでの可変変数

だから、1列と2つのプロセスが同じ時間でそれを修正...

import multiprocessing as mp 
from multiprocessing.sharedctypes import Value, Array 
import time 

def decrement(baris): 
    for x in range(0,5): 
     c = [x-1 for x in baris] 
     baris = Array('i', c) 
     print(baris[:]) 
     time.sleep(1) 
    print(baris[:]) 

def assign(baris): 
    for x in range(0,2): 
     f = baris[:] 
     f[1] = 5 
     baris = Array('i',f) 
     time.sleep(1) 
    print(baris[:]) 


if __name__ == '__main__': 
    baris = Array('i',[10,10,10], lock=mp.Lock()) 
    decrease = mp.Process(target = decrement, args=(baris,)) 
    decrease.daemon = True 
    decrease.start() 
    change = mp.Process(target = assign, args=(baris,)) 
    change.daemon = True 
    change.start() 

    decrease.join() 
    change.join() 

    dir(baris) 
    print(baris[:])# + 'Final') 

バリスは、私が最後に変更を望む変数です。 cとfは代理リストです。プロセスが実行されると、プロセスはbaris [1]の変更値を5に割り当てますが、 'decrement'プロセスはその変更に言及しませんでした。そして、結局、バリスは全く変わりませんでした!!私は立ち往生し、何をすべきかを知りませんでした。私が望んでいるものを実行する方法はありますか?結局私はバリス= [5,4,5]を得ることを望む。

私の文法が間違っていれば正解してください。

+0

'sharedctypes'を使うとき、pythonのドキュメントはプロキシリストを使いません。私の推測では、barisは共有ポインターであり、プロキシリストを使ってそれを割り当てると、渡されるポインター値のローカルコピーを変更するだけです。 – ktb

答えて

1

私はちょうど私のコメントをテストしました。

import multiprocessing as mp 
from multiprocessing.sharedctypes import Array 
import time 

def decrement(baris): 
    for x in range(0,5): 
     for i, v in enumerate(baris): 
      baris[i] = v - 1 
     print(baris[:]) 
     time.sleep(1) 
    print(baris[:]) 

def assign(baris): 
    for x in range(0,2): 
     baris[1] = 5 
     time.sleep(1) 
    print(baris[:]) 


if __name__ == '__main__': 
    baris = Array('i',[10,10,10], lock=mp.Lock()) 
    decrease = mp.Process(target = decrement, args=(baris,)) 
    decrease.daemon = True 
    decrease.start() 
    change = mp.Process(target = assign, args=(baris,)) 
    change.daemon = True 
    change.start() 

    decrease.join() 
    change.join() 

    dir(baris) 
    print(baris[:])# + 'Final') 

バリスは、共有ポインタで、プロキシリストを使用して戻ってそれに割り当てるときに、あなたは単に渡されるポインタ値のローカルコピーを変更しています。共有値を変更する場合は、共有値に直接割り当てを行う必要があります。

+0

OH Man!その作業!私はそれを知って非常に幸せです!訂正と説明に感謝します! –