Python 如何为多处理初始化字符串数组

Python 如何为多处理初始化字符串数组,python,python-3.x,multiprocessing,python-multithreading,Python,Python 3.x,Multiprocessing,Python Multithreading,下面是进程之间共享状态的示例代码 from multiprocessing import Process, Value, Array def f(n, a): n.value = 3.1415927 for i in range(len(a)): a[i] = -a[i] if __name__ == '__main__': num = Value('d', 0.0) arr = Array('i', range(10)) p = P

下面是进程之间共享状态的示例代码

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])
输出是

3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
我想用字符串元素而不是整数元素初始化列表。然后我想分配列表特定的字符串元素。我的代码如下

from multiprocessing import Process, Value, Array

def f(a):
    a = ["up", "down", "left"]

if __name__ == '__main__':
    arr = Array('b', [])

    p = Process(target=f, args=(arr))
    p.start()
    p.join()

    print(arr[:])
我希望输出是

["up", "down", "left"]
但我得到的是输出

TypeError: f() missing 1 required positional argument: 'a'
[]

您需要传递一个参数元组,您需要添加一个尾随逗号来创建元组:

 p = Process(target=f, args=(arr,)) # <- trailing comma
逗号创建元组而不是参数

不知道多处理有什么帮助,但要获得您想要的输出:

from multiprocessing import Process, Value, Array
from ctypes import c_char_p
def f(a):
    a[:] = ["up", "down", "left"]


if __name__ == '__main__':
    arr = Array(c_char_p, 3)
    p = Process(target=f, args=(arr,))
    p.start()
    p.join()
    print(arr[:])
['up', 'down', 'left']

数组的第一个arg是我们需要使用的类型
ctypes。当我们添加字符串时,第二个arg是数组的大小,即3个元素。

过程期望
args
是一个元组,而不是只传递
arr

args是目标调用的参数元组


谢谢,我修复了元组错误,但仍然没有得到所需的输出。我仍然收到空列表[]。你知道如何解决这个问题吗?@SagwaTheCat,这与你原来的问题完全不同,但显然你得到了一个空列表,因为你的函数什么都不做,arr是一个空数组,所以你得到了一个空数组,你还希望得到什么?谢谢你,但是我现在得到了以下输出
TypeError:需要字节或整数地址,而不是str实例[None,None,None]
啊好的,刚才看到你在使用python3,要按原样工作,你需要传递字节
[b“up”,b“down”,b“left”]
,这里有一个解释,你真的在使用字符串吗?这很奇怪,我的代码可能有问题。我会设法解决这个问题。谢谢你的帮助。大致相同,但显然我们同时写下了答案?我们几乎同时回答。我修复了类型错误,但问题的主要部分仍然没有回答。我仍然收到一个空列表作为输出。
from multiprocessing import Process, Value, Array
from ctypes import c_char_p
def f(a):
    a[:] = ["up", "down", "left"]


if __name__ == '__main__':
    arr = Array(c_char_p, 3)
    p = Process(target=f, args=(arr,))
    p.start()
    p.join()
    print(arr[:])
['up', 'down', 'left']
a = (arr)
print(type(a))
# Output: <class 'multiprocessing.sharedctypes.SynchronizedArray'>

a = (arr,)
print(type(a))
# Output: <type 'tuple'>
p = Process(target=f, args=(arr,))  # notice the , after arr