Помещение функции cffi в lru_cache вызывает segfault - PullRequest
2 голосов
/ 24 марта 2019

Если я помещаю функцию 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)
...