提问人:Lalo Ren 提问时间:4/12/2023 最后编辑:Ajeet VermaLalo Ren 更新时间:4/12/2023 访问量:37
为什么这里使用另一个线程来刷新数据?
Why is another thread used here to flush the data?
问:
我正在阅读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()
我是新手,我不知道这是否是确保刷新数据的一种方式
答:
2赞
Lie Ryan
4/12/2023
#1
似乎是代码库作者的合并错误。
dron22 的原始拉取请求删除了对 dump() 的主线程调用: https://github.com/patx/pickledb/issues/18
但是当补丁被维护者 patx 合并时,它保留了主线程转储:https://github.com/patx/pickledb/commit/658fdda86abbd1b5a37fb0f9fc678ca145cc25c6
无论如何,这一切都没有意义,即使在单独的线程中写入文件也无法使您免于所有数据损坏的情况。在数据库中写入结构化数据时,您需要实际执行原子文件系统操作或具有日志功能以防止数据损坏,这两者都不是容易实现的。
这也是为什么你不应该将别人的宠物数据库项目用于重要项目的另一个原因,尤其是那些几乎没有维护的项目。保持主流数据库。
评论
patx/pickledb#80
中被问到。无论如何,它看起来都是冗余执行,因为它所做的只是按顺序写入相同的数据两次(线程启动和线程加入之后立即没有任何其他线程运行实际上是单个阻塞操作)。git blame