Python:一个打开的Thread如何处理多个api请求?

Python: How can one open Thread handle multiple api requests?

我正在使用 Flask-restx 和 Spacy NER 模型。

我有一个 api 必须接收文本和 ID 号,预测一个标签和 return 使用 spacy nlp 模型。此 nlp 模型特定于特定的 Id 号码。

示例:对于 Id '1',将加载 nlp 模型 'a' 并用于预测;对于 Id '2',将使用 nlp 模型 'b',等等

我想知道我是否可以为预加载特定 nlp 模型的特定 ID 保持打开的线程,并且当发送请求时,根据 ID 号,打开的特定线程可以处理数据和 return 一个值很快。

示例: api 已收到一个请求,即已为 id '5' 创建了一个新的 nlp 模型 'x' 并将被使用,因此打开一个新线程并加载模型 'x'并且 ID 号为“5”的所有请求仅由该线程处理。

目的是存在一个预加载的模型,因此在发送请求时,可以在几秒钟内对其进行处理和赋值 returned。加载 spacy 模型大约需要 30 秒,每次发送请求时都无法完成,因为会有超时。

这可以做到还是有其他方法可以做到?

我建议你只依赖 Flask 线程模型并将 NLP 模型包装到实现模型延迟加载的对象中(仅在需要时)和一个单独的工厂函数来创建和缓存这些对象。添加一个 threading.Lock 以确保 NLP 解析器中一次只有一个 Flask 线程。

示例代码:

from threading import Lock

MODELS = {}

class NlpModel():
    _model = None
    _lock = Lock()

    def __init__(self, model_id):
        self._id = model_id

    @property
    def model(self):
        if self._model is None:
            self._model = slow_load_model_with_something(self._id)
        return self._model

    def parse(self, data):
        with self._lock:
            # only one thread will be in here at a time
            return self.model.do_your_thing(data)


def get_model(model_id):
  model = MODELS.get(model_id, None)
  if not model:
    model = NlpModel(model_id)
    MODELS[model_id] = model
  return model

# Example Flask route
@app.route('/parse/<model_id>')
def parse_model(model_id):
    model = get_model(model_id)
    model.parse(data_from_somewhere)