2014-09-19 60 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