多处理的分段故障.使用ctypes.c_char_p的数组



我想创建一个多处理。存储音频数据字节串的数组,我读到ctypes.c_char_p是创建这样一个数组的合适ctype,但当我试图用一个小的整数数组初始化数组时,抛出了这个错误:

>>> spam = multiprocessing.Array(ctypes.c_char_p, [1, 2, 3])
>>> spam[:]
Segmentation fault (core dumped)

这是我用来初始化它的数组的问题吗?

您正试图创建一个指向字节字符串的指针的数组,因此multiprocessing.Array初始化器的第二个参数应该是数组的integer大小(即元素数量(,或者是正确类型的初始化器,在您的情况下应该是字节字符串列表:

import multiprocessing
import ctypes
# Create array of one pointer to a bytestring:
spam = multiprocessing.Array(ctypes.c_char_p, [b'abc'])
print(spam[0])

打印:

b'abc'

但是,有一个问题:如果您试图将这个Array实例传递给另一个进程,那么数组中包含的字符指针是否仍然是子进程中的有效地址。通常,答案是否定的。对于使用方法fork创建新进程的平台,新的子进程将从主进程继承其内存,您可能能够将数组传递给子进程,它将能够访问字节字符串。但这在Windows等平台上会失败,这些平台使用方法派生来创建新进程,其中子进程以新的地址空间开始:

def worker(arr):
print(arr[0])
if __name__ == '__main__':
from multiprocessing import Process, Array
from ctypes import c_char_p
spam = Array(c_char_p, [b'abc'])
print(spam[0])
p = Process(target=worker, args=(spam,))
p.start()
p.join()

但是,传递字节字符宽字符

def worker(arr):
b = b''.join(arr)
print(b)
if __name__ == '__main__':
from multiprocessing import Process, Array
from ctypes import c_char
spam = Array(c_char, b'abc')
p = Process(target=worker, args=(spam,))
p.start()
p.join()

打印:

b'abc'

如果您想传递字节字符串或Unicode字符串,我建议您传递一个字节或字符数组

最新更新