将字符串分配给共享的多处理池阵列

时间:2018-07-21 05:57:53

标签: python arrays multiprocessing shared-memory pool

我正在尝试使用以下代码将字符串分配给共享的多处理数组变量,这将导致错误:RuntimeError: SynchronizedArray objects should only be shared between processes through inheritance。首先,我想知道是否有任何方法可以将数组作为参数传递,因为它似乎不是这样的。

import multiprocessing
from itertools import repeat
import ctypes

list_1 = ["bob", "joe", "fred"]
list_index = [0, 1, 2]

def function_1(index_num, name, shared_array):
    shared_array[index_num] = name

if __name__ == "__main__":
    pool = multiprocessing.Pool(processes = 3)
    shared_arr = multiprocessing.Array(ctypes.c_wchar_p, ["", "", ""])
    pool.starmap(function_1, zip(list_index, list_1, repeat(shared_arr, 3)))
    pool.close()
    pool.join()

第二,我尝试将共享数组移出参数而不移到name == main之外,以便可以继承。这是新代码:

import multiprocessing
import ctypes

list_1 = ["bob", "joe", "fred"]
list_index = [0, 1, 2]
shared_arr = multiprocessing.Array(ctypes.c_wchar_p, ["", "", ""])

def function_1(index_num, name):
    shared_arr[index_num] = name

if __name__ == "__main__":
    pool = multiprocessing.Pool(processes = 3)
    pool.starmap(function_1, zip(list_index, list_1))
    pool.close()
    pool.join()
    print(shared_arr[0])

有了这个新代码,字符串似乎可以很好地进入共享变量,但是当我使用print(shared_arr[0])打印出一个值时,它给出了错误ValueError: character U+162c640 is not in range [U+0000; U+10ffff]。我一直在阅读其他stackoverflow帖子,其中说使用ctypes.c_wchar_p作为数组的类型(我这样做了),所以我不明白为什么它不喜欢使用的数据类型。

谢谢!

0 个答案:

没有答案