多处理共享变量不更新

时间:2017-02-01 16:44:36

标签: python python-2.7 numpy multiprocessing python-multiprocessing

我正在尝试在使用多处理模块时更新共享变量(命名空间中的numpy数组)。但是,变量没有更新,我也不明白为什么。

以下是一个示例代码来说明这一点:

from multiprocessing import Process, Manager
import numpy as np

chunk_size = 15
arr_length = 1000
jobs = []
namespace = Manager().Namespace()
namespace.arr = np.zeros(arr_length)
nb_chunk = arr_length/chunk_size + 1


def foo(i, ns):
    from_idx = chunk_size*i
    to_idx = min(arr_length, chunk_size*(i+1))
    ns.arr[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx)

for i in np.arange(nb_chunk):
    p = Process(target=foo, args=(i, namespace))
    p.start()
    jobs.append(p)
for i in np.arange(nb_chunk):
    jobs[i].join()

print namespace.arr[:10]

2 个答案:

答案 0 :(得分:1)

您无法在Python中跨进程共享内置对象,如listdict。为了在流程之间共享数据,Python's multiprocessing提供了两种数据结构:

另请阅读:Exchanging objects between processes

答案 1 :(得分:0)

问题是ns.arr[from_idx:to_idx] = ...对象没有注意到您使用Manager().List()更改任何内容(因为您正在处理内部数据结构),因此不会传播到其他进程。

https://developer.ibm.com/answers/questions/352486/bip3732e-the-specified-wsdl-binding-could-not-be-f.html#answer-352715非常了解这里发生的事情。

要修复它,请将列表创建为ns[from_idx:to_idx] = ...并将此列表传递给流程,以便from multiprocessing import Process, Manager import numpy as np chunk_size = 15 arr_length = 1000 jobs = [] arr = Manager().list([0] * arr_length) nb_chunk = arr_length/chunk_size + 1 def foo(i, ns): from_idx = chunk_size*i to_idx = min(arr_length, chunk_size*(i+1)) ns[from_idx:to_idx] = np.random.randint(0, 100, to_idx-from_idx) for i in np.arange(nb_chunk): p = Process(target=foo, args=(i, arr)) p.start() jobs.append(p) for i in np.arange(nb_chunk): jobs[i].join() print arr[:10] 被识别为更改并传播到流程:

DateTime TimeIn = Convert.ToDateTime("08:00");
DateTime TimeOut = Convert.ToDateTime("02:00");
TimeSpan ts = TimeIn - TimeOut;