Если я помещаю функцию cffi в lru_cache
, я получаю ошибку, но не могу понять, почему.
Я компилирую простые функции C во время выполнения с пакетом cffi
. Я хочу кэшировать результаты этой компиляции, потому что компиляция имеет нетривиальную стоимость. Наиболее очевидное решение - lru_cache
из functools
. Тем не менее, это вызывает segfault, когда я пытаюсь вызвать функцию во второй раз. Почему это происходит и что я могу сделать, чтобы это исправить? Одно из объяснений заключается в том, что вызов сборщика мусора в 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)