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

时间:2014-09-19 16:10:43

标签: python multiprocessing

我有这样的代码

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

嗯,多线程和多处理是不同的事情。

使用多线程线程共享对同一阵列的访问权。

通过多处理,每个进程都有自己的数组副本。

答案 2 :(得分:1)

multiprocessing.Pool是一个进程池,而不是一个线程池。

如果您需要线程池,请使用multiprocess.pool.ThreadPool


替换:

from multiprocessing import Pool

使用:

from multiprocessing.pool import ThreadPool as Pool