Skip to main content
 首页 » 编程设计

python之尝试使用多处理来填充 python 中的数组

2025年05月04日14jackei

我有这样的代码

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 中的值没有随着多线程而改变,可能有什么问题?

谢谢

请您参考如下方法:

您在这里使用的是多进程,而不是多线程。正因为如此,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