Python dumbdbm, когда данные будут записаны обратно на диск?

Я использую Python2.7 dumbdbm, но этот вопрос также относится к Python3 dbm.dumb,

В документации сказано:

dumbdbm.sync()
Синхронизируйте каталог на диске и файлы данных. Этот метод вызывается методом sync() объектов Shelve.

У меня три вопроса:

  1. Если я не позвоню sync будет обновляться файл на диске?
  2. И всегда ли эта функция записывает данные обратно на диск, а не обратно?
  3. Что если я позвоню close?

1 ответ

Решение

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

dumbdbm.py файл должен быть в вашем /Python/Lib каталог и также может быть просмотрен онлайн в вашем браузере через систему контроля версий исходного кода Mercurial по адресу:

https://hg.python.org/cpython/file/2.7/Lib/dumbdbm.py

Первое, на что стоит обратить внимание, это длинный комментарий в начале частного _Database класс - что такое dumbdbm база данных действительно есть - потому что она, как правило, имеет дело с тем, что кажется общей темой ваших вопросов:

class _Database(UserDict.DictMixin):

    # The on-disk directory and data files can remain in mutually
    # inconsistent states for an arbitrarily long time (see comments
    # at the end of __setitem__).  This is only repaired when _commit()
    # gets called.  One place _commit() gets called is from __del__(),
    # and if that occurs at program shutdown time, module globals may
    # already have gotten rebound to None.  Since it's crucial that
    # _commit() finish successfully, we can't ignore shutdown races
    # here, and _commit() must not reference any globals.

Подробную информацию о конкретных методах можно найти, прочитав исходный код для них. Учитывая это, я думаю, что ответы на ваши вопросы будут для версии 2.7 Python:

  1. Если я не позвоню sync будет обновляться файл на диске?

    Из предыдущего комментария кажется, что так будет до тех пор, пока ваша программа корректно завершит работу.

    Помимо этого, это зависит от методов, которые были вызваны. Некоторые могут, но только частично. Например, это выглядит как __setitem__() в зависимости от того, предназначен ли элемент для совершенно нового ключа или для существующего. Для последних случаев есть комментарий в конце части, в котором говорится о них (понимая, что _commit() это просто другое имя для sync()):

    Обратите внимание, что _index может быть не синхронизирован с файлом каталога: _setval() а также _addval() не обновлять файл каталога. Это также означает, что каталог на диске и файлы данных находятся во взаимно несовместимом состоянии, и они будут оставаться такими до _commit() называется. Обратите внимание, что это катастрофа (для базы данных), если программа падает (так что _commit() никогда не вызывается).

  2. И всегда ли эта функция записывает данные обратно на диск, а не обратно?

    sync() / _commit() не появляется, чтобы загрузить какие-либо данные обратно в память с диска.

  3. Что если я позвоню close ?

    close() просто звонки _commit() а затем устанавливает все внутренние структуры данных в None, предотвращая любые дальнейшие операции с базой данных.

В заключение, для несколько юмористического взгляда на мета-предмет здесь, я предлагаю вам прочитать Учиться читать источник, Люк.

Другие вопросы по тегам