我正在尝试使用以下代码将字符串分配给共享的多处理数组变量,这将导致错误: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
作为数组的类型(我这样做了),所以我不明白为什么它不喜欢使用的数据类型。
谢谢!