Python dumbdbm, когда данные будут записаны обратно на диск?
Я использую Python2.7 dumbdbm
, но этот вопрос также относится к Python3 dbm.dumb
,
В документации сказано:
dumbdbm.sync()
Синхронизируйте каталог на диске и файлы данных. Этот метод вызывается методом sync() объектов Shelve.
У меня три вопроса:
- Если я не позвоню
sync
будет обновляться файл на диске? - И всегда ли эта функция записывает данные обратно на диск, а не обратно?
- Что если я позвоню
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:
Если я не позвоню
sync
будет обновляться файл на диске?Из предыдущего комментария кажется, что так будет до тех пор, пока ваша программа корректно завершит работу.
Помимо этого, это зависит от методов, которые были вызваны. Некоторые могут, но только частично. Например, это выглядит как
__setitem__()
в зависимости от того, предназначен ли элемент для совершенно нового ключа или для существующего. Для последних случаев есть комментарий в конце части, в котором говорится о них (понимая, что_commit()
это просто другое имя дляsync()
):Обратите внимание, что
_index
может быть не синхронизирован с файлом каталога:_setval()
а также_addval()
не обновлять файл каталога. Это также означает, что каталог на диске и файлы данных находятся во взаимно несовместимом состоянии, и они будут оставаться такими до_commit()
называется. Обратите внимание, что это катастрофа (для базы данных), если программа падает (так что_commit()
никогда не вызывается).И всегда ли эта функция записывает данные обратно на диск, а не обратно?
sync()
/_commit()
не появляется, чтобы загрузить какие-либо данные обратно в память с диска.Что если я позвоню
close
?close()
просто звонки_commit()
а затем устанавливает все внутренние структуры данных вNone
, предотвращая любые дальнейшие операции с базой данных.
В заключение, для несколько юмористического взгляда на мета-предмет здесь, я предлагаю вам прочитать Учиться читать источник, Люк.