尝试复制回Array中的元素仅适用于整数,但不适用于Multiprocessing Python模块中的字符串

时间:2018-07-01 14:09:26

标签: python string multiprocessing

我正在尝试编写一个使用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数组填充,而整数只是一个值有关,但我不知道如何解决这个问题

1 个答案:

答案 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[:])