Django1.1 файловое многопоточное бэкэнд-решение для сессии - PullRequest
0 голосов
/ 30 апреля 2010

Сегодня я прочитал django.contrib.sessions.backend.file, в методе save SessionStore есть что-то вроде следующего, которое используется для достижения многопоточной целостности сохранения:

        output_file_fd, output_file_name = tempfile.mkstemp(dir=dir,
            prefix=prefix + '_out_')
        renamed = False
        try:
            try:
                os.write(output_file_fd, self.encode(session_data))
            finally:
                os.close(output_file_fd)
            os.rename(output_file_name, session_file_name)
            renamed = True
        finally:
            if not renamed:
                os.unlink(output_file_name)

Я не совсем понимаю, как это решает проблему целостности.

1 Ответ

0 голосов
/ 01 мая 2010

Технически это не решает проблему целостности полностью. # 9084 Решает эту проблему.

По сути, это работает с помощью tempfile.mkstemp, который гарантированно является атомарным, и записывает данные в этот файл. Затем он вызывает os.rename (), который переименует временный файл в новый файл. В Unix это удалит старый файл перед переименованием, в Windows это вызовет ошибку. Это должно быть исправлено для django 1.1

Если вы заглянули в историю изменений, то увидите, что у них ранее были блокировки, но по разным причинам изменили их на этот метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...