#python #multithreading #api #request
#питон #многопоточность #API #запрос
Вопрос:
Я использую модель Flask-restx и Spacy NER.
У меня есть api, который должен получать текст и идентификационный номер, предсказывать метку и возвращать то же самое, используя модель spacy nlp. Эта модель нлп специфична для конкретного идентификационного номера.
Пример: Для идентификатора «1» модель нлп » а «должна быть загружена и использована для прогнозирования; для идентификатора» 2 «должна использоваться модель нлп «в» и т. Д.
Я хочу знать, возможно ли, чтобы я мог сохранять открытые потоки для определенных идентификаторов, которые предварительно загрузили конкретную модель nlp, и когда отправляется запрос в соответствии с номером идентификатора, этот конкретный открытый поток может быстро обработать данные и вернуть значение.
Пример: api получил запрос о том, что новая модель nlp » x «была создана для идентификатора» 5 «и будет использоваться, поэтому открывается новый поток с загруженной моделью «x», и все запросы, имеющие идентификационный номер «5», обрабатываются только этим потоком.
Цель состоит в том, чтобы присутствовала предварительно загруженная модель, поэтому при отправке запроса он может быть обработан и возвращено значение за несколько секунд. Загрузка модели spacy занимает около 30 секунд, что невозможно делать каждый раз при отправке запроса, так как будет время ожидания.
Можно ли это сделать или есть какой-то другой способ сделать это?
Комментарии:
1. Да, это можно сделать, но есть ли конкретная причина, по которой каждой модели НЛП нужен свой собственный поток ? Если они могут быть просто объектами Python, которые загружают набор данных при инициализации, то вы можете просто создать их глобальный набор при запуске, вставить их в дикт для сопоставления name-gt;obj и использовать их из обработчиков запросов. Если они не являются потокобезопасными, вам необходимо синхронизировать их с
Lock
объектами.2. Будут созданы новые модели, из-за которых я не смогу загрузить их во время запуска. Когда будет создан новый идентификатор, таблица базы данных сообщит мне, какая модель должна использоваться для этого идентификатора, который затем необходимо загрузить. Единственная проблема заключается в том, что при каждом запросе я не могу загрузить конкретную модель в режиме реального времени.
3. Хорошо, похоже, вам действительно не нужно больше потоков, объясняя, как это сделать, в моем ответе.
Ответ №1:
Я предлагаю вам просто положиться на модель потоковой передачи Flask и обернуть модели NLP в объекты, которые реализуют ленивую загрузку модели (только когда это необходимо), и отдельную заводскую функцию, которая создает и кэширует эти объекты. Добавьте резьбу.Заблокируйте, чтобы убедиться, что только один поток колбы одновременно находится в анализаторе NLP.
Пример кода:
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/lt;model_idgt;') def parse_model(model_id): model = get_model(model_id) model.parse(data_from_somewhere)
Комментарии:
1. Большое вам спасибо за это решение. Я включил его в свой код, и он отлично работает! Я новичок в этой области и застрял в этой ситуации на некоторое время, не зная, как решить проблему. Еще раз спасибо вам!