Cython 多处理共享内存

Shared memory with Cython multiprocessing

我正在尝试使用 Cython 和多处理包在共享内存中定义一个数组。但是,我无法在 .pxd 文件中声明此数组。

简单的测试代码如下。我有一个带有变量 my_data 的 Cython class 数据。此变量 my_data 将是共享数组。

Data.pxd:

    cimport numpy as np
    cdef class Data:
        cdef public np.ndarray my_data

Data.pyx:

    cdef class Data:
        def __init__(self):
            pass

然后,我在主文件中声明共享数组:

main_file.py:

    # -*- coding: utf-8 -*-
    import pyximport; 
    import numpy as np
    from multiprocessing import Array
    pyximport.install(setup_args={"include_dirs":np.get_include()},)

    from Data import *

    ### Create Data
    N  = 1500
    dc = Data()
    dc.my_data  = Array('d', N, lock=False)

运行 main_file.py 给出 TypeError:

    TypeError: Cannot convert c_double_Array_1500 to numpy.ndarray

我试图将 my_data 声明为一个 cpython 数组,但这给出了相同的 TypeError。 有没有办法在 Data.pxd 中声明 my_data 以便它可以与多进程共享?

您遇到的问题是 multiprocessing.Array 不是一个 numpy 数组,而是一个 "ctypes array"(根据 the multiprocessing documentation)。

使其工作的最简单方法是使用 Cython typed memoryview 功能,它接受任何具有数组接口的内容:

# Data.pxd
cdef class Data:
    cdef public double[:] my_data

当我进行此更改时,您的程序可以正常工作,并且也可以很好地处理 numpy 数组、python 数组以及您尝试扔给它的大多数其他东西。

请注意,此版本中不灵活的一件事是该数组是您未指定的双精度数组。如果您需要在此处接受任何数据类型(而不仅仅是双精度),您可能无法轻松地使用 cdef 类型。