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

标签 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 = 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'
[]

最佳答案

你需要传递一个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 个元素。

关于python - 如何为多处理初始化字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32419360/

相关文章:

python - 如何将 Python tkinter canvas postscript 文件转换为 PIL 可读的图像文件?

python - 如何将这段数据保存到csv文件中?

python - 我有一个巨大的 If 语句列表,想清理我的代码

python - 并行使用Python的dask将多个CSV分别读取到数据帧列表中不起作用

python - 如果我想给我的进程池更多的工作,我可以在 Pool.close() 之前调用 Pool.join() 吗?

python - 为什么 python 脚本在主进程退出后挂起

python - 迷失在 XML 和 Python 中

python - 将 32 位二进制数转换为 4 个独立的 8 位部分的函数

python - 尝试安装 Python 音频工具时 make install 失败

python - 在 Jupyter Python Notebook 中显示所有数据框列