如何为多进程初始化一个字符串数组

6
这里是共享进程状态的示例代码。
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'
[]

我修复了类型错误,但是我的问题的主要部分仍未得到回答。我仍然收到一个空列表作为输出。 - SagwaTheCat
2个回答

6

您需要传递参数元组,需要添加一个逗号才能创建元组:

 p = Process(target=f, args=(arr,)) # <- trailing comma

或者明确使用元组:

 args=tuple([arr]))

逗号创建元组而不是括号。

我不知道多进程如何帮助,但为了获得您想要的输出:

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']

Array的第一个参数是类型,我们需要使用ctypes.c_char_p作为字符串的添加方式,第二个参数是数组的大小即3个元素。


如果我能够做到这一点,那么我就能够执行我的实际任务。 - SagwaTheCat
如何完成它完全取决于任务,我添加了一些代码,但没有上下文很难给出更有用的示例。 - Padraic Cunningham
1
谢谢,但我现在得到了以下输出:TypeError: bytes or integer address expected instead of str instance [None, None, None] - SagwaTheCat
1
啊,好的。刚刚看到你在使用Python3,要正常工作,你需要传递字节 [b"up", b"down", b"left"],这里有一个解释:https://dev59.com/Mmw05IYBdhLWcg3wcReu。你实际上是在使用字符串吗? - Padraic Cunningham
1
这很奇怪,可能是我的代码出了问题。我会尝试修复它。非常感谢你的帮助。 - SagwaTheCat
显示剩余9条评论

3
进程期望 args 是一个元组,但是你只传递了 arrhttps://docs.python.org/2/library/multiprocessing.html args 是目标调用的参数元组。
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

差不多一样,但显然我们同时写了答案?我们几乎同时回答了。 - HelloWorld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接