如果将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)