2014-09-19 74 views
1

數組我有這樣嘗試使用多填寫蟒蛇

x = 3; 
y = 3; 
z = 10; 
ar = np.zeros((x,y,z)) 

from multiprocessing import Process, Pool 

para = [] 
process = [] 
def local_func(section): 
    print "section %s" % str(section) 
    ar[2,2,section] = 255 
    print "value set %d", ar[2,2,section] 

pool = Pool(1) 

run_list = range(0,10) 
list_of_results = pool.map(local_func, run_list) 

print ar 

在AR的價值不是用多線程改變了代碼,可能是什麼問題?

謝謝

回答

3

你在這裏使用多個進程,而不是多線程。因此,local_func的每個實例都獲得自己的ar單獨副本。您可以使用custom Manager創建共享numpy的陣列,它可以傳遞給每個子進程,讓你期望的結果:

import numpy as np 
from functools import partial 
from multiprocessing import Process, Pool 
import multiprocessing.managers 

x = 3; 
y = 3; 
z = 10; 

class MyManager(multiprocessing.managers.BaseManager): 
    pass 
MyManager.register('np_zeros', np.zeros, multiprocessing.managers.ArrayProxy) 


para = [] 
process = [] 
def local_func(ar, section): 
    print "section %s" % str(section) 
    ar[2,2,section] = 255 
    print "value set %d", ar[2,2,section] 

if __name__ == "__main__": 
    m = MyManager() 
    m.start() 
    ar = m.np_zeros((x,y,z)) 

    pool = Pool(1) 

    run_list = range(0,10) 
    func = partial(local_func, ar) 
    list_of_results = pool.map(func, run_list) 

    print ar 
+0

達諾,我試過你的解決方案,它的工作原理。謝謝 – tanyonder 2014-09-19 18:51:49

2

好吧,多線程和多處理是不同的東西。

多線程線程共享對同一陣列的訪問。

多處理每個進程都有自己的數組副本。

1

multiprocessing.Pool進程池,而不是線程池。

如果你想線程池,使用multiprocess.pool.ThreadPool


替換:

from multiprocessing import Pool 

有:

from multiprocessing.pool import ThreadPool as Pool 
+1

@tanyonder,歡迎堆棧溢出!有些人試圖回答你的問題。如果這對你有幫助,你可以通過[接受答案](http://meta.stackoverflow.com/a/5235)告訴社區,這對你最有用。 – falsetru 2014-09-19 16:24:49

+0

@tanyonder請記住,當您使用線程而不是進程時,由於GIL,您不會得到真正的線程併發執行。 – dano 2014-09-19 16:25:30

+0

那麼它只會在多核桌面上產生一個線程,是否還有其他問題? – tanyonder 2014-09-19 16:26:12