【问题标题】:How to initialize a string array for multiprocessing如何初始化字符串数组以进行多处理
【发布时间】:2015-12-01 20:52:24
【问题描述】:

这是进程间共享状态的示例代码

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

【问题讨论】:

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

标签: python python-3.x multiprocessing python-multithreading


【解决方案1】:

你需要传递一个args的元组,你需要添加一个尾随逗号来创建一个元组:

 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,这与你原来的问题完全不同,但显然你得到一个空列表,因为你的函数什么都不做,而 arr 是一个空数组,所以你得到一个空数组,你还能期待什么?
  • 谢谢你,但我现在得到以下输出TypeError: bytes or integer address expected instead of str instance [None, None, None]
  • 啊,好吧,刚刚看到你在使用python3,要按原样工作,你需要传递字节[b"up", b"down", b"left"],这里有解释stackoverflow.com/questions/7237133/…,你真的在​​使用字符串吗?
  • 这很奇怪,可能是我的代码有问题。我会尝试解决这个问题。感谢您的所有帮助。
【解决方案2】:

Process 期望 args 是一个元组,而不是您只需传递 arr

https://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

【讨论】:

  • 差不多,但显然我们同时写了答案?我们几乎同时回答。
猜你喜欢
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多