изоляция транзакции - PullRequest
       41

изоляция транзакции

0 голосов
/ 08 октября 2018

Я использую флягу для обработки запросов, которые содержат URL, указывающий на документ.Когда приходит запрос, документ, на который указывает URL, сохраняется в файл.Файл открывается, обрабатывается и генерируется строка json в зависимости от данных в документе.Строка json отправляется в ответе.

Мой вопрос касается запросов, которые приходят с очень коротким временем между ними.Когда User1 отправляет url_1 в своем запросе, документ по адресу url_1 сохраняется.Пользователь2 отправляет запрос с URL_2 до открытия документа от Пользователя1.Будет ли сгенерированная строка json, отправленная пользователю1, основана на документе по адресу url_2?Это очень вероятно произойдет?

Следующая картина иллюстрирует сценарий:

transaction isolation

Вот как выглядит приложение для колб:

app = Flask(__name__)

@app.route("/process_document", methods=['GET'])
def process_document():
    download_location = "document.txt"
    urllib.request.urlretrieve(request.args.get('document_location'),download_location)
    json = some_module.construct_json(download_location)
    return json

1 Ответ

0 голосов
/ 08 октября 2018

Если многопоточность включена (по умолчанию отключена), то ситуация может возникнуть.Если вам необходимо использовать локальную файловую систему, всегда желательно изолировать ее, например, с помощью временного каталога.Например, вы можете использовать tempfile.TemporaryDirectory.

import os
from tempfile import TemporaryDirectory

# ...

@app.route("/process_document", methods=['GET'])
def process_document():
    with TemporaryDirectory() as path:
        download_location = os.path.join(path, "document.txt")
        urllib.request.urlretrieve(
            request.args.get('document_location'),
            download_location
        )
        json = some_module.construct_json(download_location)
        return json

Использование временного каталога или файла помогает избежать проблем с параллелизмом, как вы описали.Но это также защищает от проблем, когда, скажем, ваша функция генерирует исключение и хранит файл (это может не защитить от серьезных сбоев).Тогда вы случайно не получите файл из предыдущего запуска.

...