2017-06-01 45 views
1

好吧,我尝试通过两个不同的过程修改数组的值。我已阅读有关使用代理列表的文档,我使用它,但我不知道为什么它不工作。多处理中的可变变量

所以1个阵列和两个过程修改它,以相同时间..

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,但进程'递减'没有提及该更改。最后,巴里根本没有改变!我坚持不知道该怎么做,是否有任何可能的方式来运行我的愿望?最后,我希望我能得到baris = [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男人!它的工作!我很高兴知道它!非常感谢您的纠正和解释! –