如何从cython访问python共享内存?

如何从cython访问python共享内存?,python,cython,shared-memory,python-3.8,Python,Cython,Shared Memory,Python 3.8,我有两个进程,一个创建共享内存,另一个访问它。我正在使用Python 3.8 第二个进程可以选择仅使用python函数或通过cython访问共享内存。cython选项失败-我得到一个SIGSEGV 是否有一些特殊的方法来获取cython中的共享内存?这篇文章似乎没有展示如何真正获得python共享内存 过程1(设置\u shm.py): 过程2(获取\u shm.py): Cython类(c_get_shm.pyx) Setup.py from setuptools import setup,

我有两个进程,一个创建共享内存,另一个访问它。我正在使用Python 3.8

第二个进程可以选择仅使用python函数或通过cython访问共享内存。cython选项失败-我得到一个SIGSEGV

是否有一些特殊的方法来获取cython中的共享内存?这篇文章似乎没有展示如何真正获得python共享内存

过程1(设置\u shm.py):

过程2(获取\u shm.py):

Cython类(c_get_shm.pyx)

Setup.py

from setuptools import setup, Extension
from Cython.Build import cythonize

extensions = [
    Extension("c_get_shm", ["./c_get_shm.pyx"],
              libraries=['rt'])
]
setup(
    ext_modules=cythonize(extensions, gdb_debug=True)
)
我正在用其中一个运行脚本

  • python./setup\u shm.py--cython
  • python./setup_shm.py
我能看到SIGSEGV的唯一方法是使用strace:

Vectors Class for getting shared memory - psm_23cd04df
get_shared_array psm_23cd04df
shm buf is <memory at 0x7f8b4d66df40> size 16
data is <MemoryView of 'ndarray' object>, [2, 2, 0, 0, 0, 0, 0, 0]
[{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], 0, NULL) = 868
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_DUMPED, si_pid=868, si_uid=1000, si_status=SIGSEGV, si_utime=0, si_stime=0} ---
close(5)                                = 0
munmap(0x7f8b65698000, 16)              = 0
close(4)                                = 0
unlink("/dev/shm/psm_23cd04df")         = 0
获取共享内存的向量类-psm_23cd04df 获取共享阵列psm\U 23cd04df shm buf是16号的 数据是[2,2,0,0,0,0,0,0,0] [{WIFSIGNALED(s)&&WTERMSIG(s)=SIGSEGV&&WCOREDUMP(s)}],0,NULL)=868 ---SIGCHLD{si_signo=SIGCHLD,si_code=CLD_DUMPED,si_pid=868,si_uid=1000,si_status=SIGSEGV,si_utime=0,si_stime=0}--- 关闭(5)=0 munmap(0x7f8b65698000,16)=0 关闭(4)=0 取消链接(“/dev/shm/psm_23cd04df”)=0
我尝试过gdb python并从中运行脚本,但没有堆栈跟踪。

对于遇到类似问题的人,请确保在Cython中声明共享内存。我假设SIGSEGV是因为不允许它访问内存,除非您这样做

cdef class Vectors:

    cdef public object shm_name
    cdef public float[:, :] data
    # declare the shared memory in Cython!!
    cdef public object shm

    def __init__(self, shm_name):
        self.__get_shared_array(shm_name)

    def __get_shared_array(self, shm_name: str):
        self.shm = shared_memory.SharedMemory(name=shm_name)
        self.data = np.ndarray(shape=(2, 2), dtype='f', buffer=self.shm.buf)

对于遇到类似问题的任何人,请确保在Cython中声明共享内存。我假设SIGSEGV是因为不允许它访问内存,除非您这样做

cdef class Vectors:

    cdef public object shm_name
    cdef public float[:, :] data
    # declare the shared memory in Cython!!
    cdef public object shm

    def __init__(self, shm_name):
        self.__get_shared_array(shm_name)

    def __get_shared_array(self, shm_name: str):
        self.shm = shared_memory.SharedMemory(name=shm_name)
        self.data = np.ndarray(shape=(2, 2), dtype='f', buffer=self.shm.buf)

我认为应该是
val=vectors.data[0,0]
(或者至少
val=vectors.data.base[0,0]
)。我怀疑这是否是你的问题。我唯一能看到的是,在Cython中,你从来没有关闭过它。这些注释实际上非常有用,因为它们导致抛出更多错误,而不仅仅是代码分段错误。我想我有一个有效的解决办法。所以关闭共享内存似乎是正确的答案。事实上,我不需要在cython类中关闭。主要问题是没有将共享内存声明为c变量。我认为应该是
val=vectors.data[0,0]
(或者至少
val=vectors.data.base[0,0]
)。我怀疑这是否是你的问题。我唯一能看到的是,在Cython中,你从来没有关闭过它。这些注释实际上非常有用,因为它们导致抛出更多错误,而不仅仅是代码分段错误。我想我有一个有效的解决办法。所以关闭共享内存似乎是正确的答案。事实上,我不需要在cython类中关闭。主要问题是没有将共享内存声明为c变量。
Vectors Class for getting shared memory - psm_23cd04df
get_shared_array psm_23cd04df
shm buf is <memory at 0x7f8b4d66df40> size 16
data is <MemoryView of 'ndarray' object>, [2, 2, 0, 0, 0, 0, 0, 0]
[{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], 0, NULL) = 868
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_DUMPED, si_pid=868, si_uid=1000, si_status=SIGSEGV, si_utime=0, si_stime=0} ---
close(5)                                = 0
munmap(0x7f8b65698000, 16)              = 0
close(4)                                = 0
unlink("/dev/shm/psm_23cd04df")         = 0
cdef class Vectors:

    cdef public object shm_name
    cdef public float[:, :] data
    # declare the shared memory in Cython!!
    cdef public object shm

    def __init__(self, shm_name):
        self.__get_shared_array(shm_name)

    def __get_shared_array(self, shm_name: str):
        self.shm = shared_memory.SharedMemory(name=shm_name)
        self.data = np.ndarray(shape=(2, 2), dtype='f', buffer=self.shm.buf)