我正在尝试编写一个使用multiprocessing模块对填充了字符串的Array进行一些计算的过程。但是,我无法获取结果。这只是一个极简代码示例:
from multiprocessing import Process, Value, Array
from ctypes import c_char_p
# Process
def f(n, a):
for i in range(0,10):
a[i] = "test2".encode('latin-1')
if __name__ == '__main__':
# Set up array
arr = Array(c_char_p, range(10))
# Fill it with values
for i in range(0,10):
arr[i] = "test".encode('latin-1')
x = []
for i in range(0,10):
num = Value('d', float(i)*F)
p = Process(target=f, args=(num, arr,))
x.append(p)
p.start()
for p in x:
p.join()
# THis works
print(num.value)
# This will not give out anything
print(arr[0])
最后一行即使被填充或更改,也不会打印出任何内容。
与我有关的主要事情是,将代码更改为仅使用整数时,它将起作用:
from multiprocessing import Process, Value, Array
from ctypes import c_char_p
def f(n, a):
for i in range(0,10):
a[i] = 5
if __name__ == '__main__':
arr = Array('i',range(10))
for i in tqdm(range(0,10)):
arr[i] = 10
x = []
for i in range(0,10):
num = Value('d', float(i)*F)
p = Process(target=f, args=(num, arr,))
x.append(p)
p.start()
for p in x:
p.join()
print(num.value)
print(arr[0])
我的最佳猜测是,这与字符串数组用char数组填充,而整数只是一个值有关,但我不知道如何解决这个问题
答案 0 :(得分:2)
This可能会回答您的问题,基本上字符串数组arr
有一个字符指针数组c_char_p
,当第一个进程调用函数f
时,字符指针是是在自身的上下文中创建的,而不是在其他进程的上下文中创建的,因此最终,当其他进程尝试访问arr
时,它将是无效的地址。
就我而言,这似乎工作正常,
from multiprocessing import Process, Value, Array
from ctypes import c_char_p
values = ['test2438']*10
# Process
def f(n, a):
for i,s in enumerate(values):
a[i] = s
if __name__ == '__main__':
# Set up array
arr = Array(c_char_p, 10)
for i in range(0,10):
arr[i] = 'test'
# Fill it with values
x = []
for i in range(0,10):
num = Value('d', float(i))
p = Process(target=f, args=(num, arr,))
x.append(p)
p.start()
for p in x:
p.join()
# This will not give out anything
print(arr[:])