簡體   English   中英

嘗試使用多重處理在python中填充數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM