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



我使用的是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秒,这不能在每次发送请求时完成,因为会有超时。

可以这样做吗?或者有其他方法可以这样做?

我建议您只依赖Flask线程模型,并将NLP模型封装到实现模型延迟加载的对象(仅在需要时(和创建和缓存这些对象的单独工厂函数中。添加螺纹。锁定以确保一次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)

最新更新