如何为多处理初始化字符串数组
How to initialize a string array for multiprocessing
这是进程间共享状态的示例代码
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
或明确使用元组:
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']
数组的第一个参数是我们在添加字符串时需要使用的类型ctypes.c_char_p
,第二个参数是数组的大小,即 3 个元素。
进程期望 args
是一个元组,而你只是传递 arr
.
https://docs.python.org/2/library/multiprocessing.html
args is the argument tuple for the target invocation.
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
这是进程间共享状态的示例代码
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
或明确使用元组:
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']
数组的第一个参数是我们在添加字符串时需要使用的类型ctypes.c_char_p
,第二个参数是数组的大小,即 3 个元素。
进程期望 args
是一个元组,而你只是传递 arr
.
https://docs.python.org/2/library/multiprocessing.html
args is the argument tuple for the target invocation.
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