我正在阅读pickdb的代码。
在这个函数中:
def dump(self):
'''Force dump memory db to file'''
json.dump(self.db, open(self.loco, 'wt'))
self.dthread = Thread(
target=json.dump,
args=(self.db, open(self.loco, 'wt')))
self.dthread.start()
self.dthread.join()
return True
我不明白为什么一个线程在使用dump()
方法后再次启动到dump()
我是新手,我不知道这是否是一种确保数据被刷新的方法
似乎是代码库作者的合并错误。
dron22的原始pull请求删除了主线程调用dump(): https://github.com/patx/pickledb/issues/18
但是当补丁被维护者patx合并时,它保留了主线程转储:https://github.com/patx/pickledb/commit/658fdda86abbd1b5a37fb0f9fc678ca145cc25c6
无论如何,这都是没有意义的,即使在单独的线程中写入文件也不会使您避免所有数据损坏的情况。在向数据库中写入结构化数据时,您需要实际执行原子文件系统操作或使用日志记录来防止数据损坏,这两者都不容易实现。
这也是为什么您不应该在重要项目中使用别人的宠物数据库项目的另一个原因,特别是那些实际上不需要维护的项目。保持主流数据库。