【问题标题】:Python: How can one open Thread handle multiple api requests?Python:一个打开的Thread如何处理多个api请求?
【发布时间】:2022-01-14 00:43:49
【问题描述】:

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

我有一个 api,它必须接收文本和 ID 号,预测标签并使用 spacy nlp 模型返回相同的标签。此 nlp 模型特定于特定的 ID 号。

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

我想知道我是否可以为已预加载特定 nlp 模型的特定 Id 保持打开线程,并且在发送请求时,根据 id 号,打开的特定线程可以处理数据并快速返回一个值。

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

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

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

【问题讨论】:

  • 是的,它可以做到,但是每个 NLP 模型需要自己的 Thread 是否有特定的原因?如果它们可以只是在初始化时加载数据集的 Python 对象,那么您可以在启动时简单地实例化它们的全局集,将它们插入到 name->obj 映射的字典中,并从请求处理程序中使用它们。如果它们不是线程安全的,则必须与 Lock 对象同步。
  • 将创建新模型,这将使​​我无法在启动期间加载它们。当创建一个新的 ID 时,数据库表会告诉我哪个模型将用于该 ID,然后需要加载该 ID。唯一的问题是,对于每个请求,我都无法实时加载特定模型。
  • 好吧听起来你真的不需要更多线程,在我的回答中解释了如何做到这一点。

标签: python multithreading api request


【解决方案1】:

我建议您只依赖 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)

【讨论】:

  • 非常感谢您提供此解决方案。我将它合并到我的代码中,效果很好!我是这个领域的新手,在这种情况下被困了一段时间,不知道如何解决这个问题。再次感谢您!
猜你喜欢
  • 2019-03-30
  • 1970-01-01
  • 2013-10-19
  • 2018-08-19
  • 2013-01-12
  • 2013-01-31
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多