首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:一个打开的线程如何处理多个api请求?

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

Stack Overflow用户
提问于 2021-12-09 06:33:55
回答 1查看 134关注 0票数 0

我使用的是酒瓶-restx和Spacy NER模型。

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

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

我想知道是否有可能使特定id保持打开线程,这些id预先加载了特定的nlp模型,并且在发送请求时,根据id号,打开的特定线程可以快速处理数据并返回值。

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-09 07:49:30

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

示例代码:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70285612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档