DJANGO: кэширование метода services.py, чтобы он всегда был доступен

Я пытаюсь использовать эту библиотеку python ML и превратить ее в APIView для моего проекта. Есть одна строка, которая загружает ML модель, что занимает около ~20с, поэтому я отделил эту строку в services.py и украсил @lru_cache, чтобы это не занимало всегда ~20с.

Поскольку lru_cache - это метод кэширования Least Recently Used, кэшированная модель быстро разблокируется и заставляет пользователя рано или поздно ждать еще 20 секунд.

Итак, я ищу способ либо кэшировать метод load_model(), чтобы он всегда был доступен, либо кэшировать его в течение определенного времени. Я пытался использовать метод cache_page для последнего, но пока безуспешно.

Есть ли лучший метод, который я могу использовать, или просто подстройка maxSize lru_cache будет более элегантным решением? Этот APIView вызывается не очень часто, что заставляет пользователя ждать ~20s каждый раз. Я надеялся просто сделать его всегда доступным, чтобы пользователю не приходилось ждать.

views.py

from .services import load_model, extract_keyword

class ExtractKeyphrase(ApiAuthMixin, APIView):
    def post(self, request):
        try:
            text = request.data["text"]
            kp_model = load_model()  # the line that takes ~20s
            keyphrases = extract_keyword(kp_model, text)

            return JsonResponse(keyphrases, status=status.HTTP_200_OK, safe=False)
        except requests.exceptions.RequestException:
            Response("Request Failed", status=status.HTTP_400_BAD_REQUEST)

services.py

from functools import lru_cache
from keyphrasetransformer import KeyPhraseTransformer
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page

# @method_decorator(cache_page(60 * 60 * 24))
@lru_cache(maxsize=2)
def load_model():
    kp_model = KeyPhraseTransformer()

    return kp_model

Если kp_model не меняется, вам не нужно использовать кэш, просто глобальная переменная:

# in another module, e.g kp_model.py
_kp_model = None

def get_kp_model():
    global _kp_model
    if not _kp_model:
        _kp_model = KeyPhraseTransformer()
    return _kp_model

Вы можете загрузить его при первом запросе POST API:

class ExtractKeyphrase(ApiAuthMixin, APIView):
    def post(self, request):
        try:
            text = request.data["text"]
            keyphrases = extract_keyword(get_kp_model(), text)

            return JsonResponse(keyphrases, status=status.HTTP_200_OK, safe=False)
        except requests.exceptions.RequestException:
            Response("Request Failed", status=status.HTTP_400_BAD_REQUEST)

Или вы можете загрузить его при запуске django, добавив:

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        get_kp_model()
Вернуться на верх