2017-06-01 84 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男人!它的工作!我很高興知道它!非常感謝您的糾正和解釋! –