Отмена внутреннего процесса Flask из веб-клиента - PullRequest
0 голосов
/ 13 марта 2019

У меня есть приложение Flask, работающее в бэкэнде и доставляющее некоторые данные клиентскому веб-приложению через некоторые конечные точки. Э.Г.

@app.route('/extract_entities_from_matching_docs', methods=['POST'])
def extract_entities_from_matching_docs():
   data = request.form
   entities = storage.get_entities_in_docs_by_keywords(data[“keywords”])
   return jsonify(entities)

Это только пример, но иногда такие методы требуют слишком много времени для обработки, и пользователь может захотеть отменить обработку от клиента (например, представьте, что у вас есть кнопка «Отмена» на клиент).

Мой вопрос: как я могу отменить запущенный процесс в бэкэнде из внешнего интерфейса? Я подумал, что могу включить флаг в циклы, поэтому, если флаг установлен в значение true, он продолжает цикл и обработку, в противном случае он просто возвращается. Но проблема с такой простой альтернативой заключается в следующем: что если клиент просто закрывает вкладку браузера? Процесс будет продолжаться на бэкэнде без какой-либо причины. Может быть, отправляя клиенту другой флаг каждые x минут, чтобы сервер знал, что клиент ожидает ответа. Но, возможно, есть более элегантное решение, которое я игнорирую.

Я не очень люблю бэкэнд, но мне нужно решить это. Итак, вы можете предложить мне другую альтернативу? Что почитать? Или вы знаете, есть ли хорошая практика для решения этой проблемы?

1 Ответ

0 голосов
/ 13 марта 2019

То, что вы хотите, не легко возможно. Как правило, решение состоит в том, чтобы не беспокоить и поддерживать запрос в фоновом режиме и просто жить с ним. В конце концов, большинство запросов, вероятно, не будут «отменены», и, следовательно, накладные расходы на разработку такого рода решений перевешивают незначительные преимущества.

Если ваши задачи действительно длительные (и под этим я подразумеваю минуты или даже намного больше), то вы должны разгрузить их на что-то вроде задач Celery. В этом случае вы можете сохранить ссылку на идентификатор задачи и отозвать ее (передача terminate=True должна также относиться к уже запущенной задаче).

...