[英]Multiprocessing in Python: Parallelize a for loop to fill a Numpy array
[英]Trying to use multiprocessing to fill an array in python
我有这样的代码
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
每个实例local_func
获得其自己的ar
单独副本。 您可以使用自定义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
好吧,多线程和多处理是不同的事情。
使用多线程线程共享对同一阵列的访问。
通过多处理,每个进程都有自己的数组副本。
multiprocessing.Pool
是一个进程池,而不是线程池。
如果需要线程池,请使用multiprocess.pool.ThreadPool
:
更换:
from multiprocessing import Pool
与:
from multiprocessing.pool import ThreadPool as Pool
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.