将cffi函数放入lru_cache中会导致segfault

时间:2019-03-24 12:04:21

标签: python python-cffi

如果将cffi函数放在lru_cache中,则会遇到段错误,但无法弄清楚原因。

我正在使用cffi软件包在运行时编译简单的C函数。我想缓存此编译的结果,因为编译花费不菲。最明显的解决方案是lru_cache中的functools。但是,当我尝试第二次调用该函数时,这会导致段错误。为什么会发生这种情况,我该怎么解决?一个线索是,在两次调用之间需要调用Python的垃圾收集器以确保segfault,但我不知道所收集的是什么导致了segfault。

import gc
from functools import lru_cache
from tempfile import TemporaryDirectory

from cffi import FFI


@lru_cache()  # Segfault goes away if I get rid of this
def build():
    # FFI
    ffi = FFI()

    ffi.cdef("""
    void func(int a);
    """)
    ffi.set_source('_temp', """
    void func(int a) {
        return;
    }
    """)

    with TemporaryDirectory() as temp_dir:
        lib_path = ffi.compile(tmpdir=temp_dir)
        lib = ffi.dlopen(lib_path)
        func = lib.func

    return func


func = build()
func(1)
gc.collect()  # Guarantees segfault
func = build()
func(1)

0 个答案:

没有答案