为什么这里使用另一个线程来刷新数据?

Why is another thread used here to flush the data?

提问人:Lalo Ren 提问时间:4/12/2023 最后编辑:Ajeet VermaLalo Ren 更新时间:4/12/2023 访问量:37

问:

我正在阅读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()

我是新手,我不知道这是否是确保刷新数据的一种方式

Python 多线程 刷新

评论

1赞 metatoaster 4/12/2023
在问题 patx/pickledb#80 中被问到。无论如何,它看起来都是冗余执行,因为它所做的只是按顺序写入相同的数据两次(线程启动和线程加入之后立即没有任何其他线程运行实际上是单个阻塞操作)。
0赞 metatoaster 4/12/2023
通过跟踪,我们可以看到这个提交引入了这个特殊的 hack,即使用线程来利用文件的保存,这样当主线程以某种方式中断时,执行转储的线程应该通过这个处理程序继续运行。git blame

答:

2赞 Lie Ryan 4/12/2023 #1

似乎是代码库作者的合并错误。

dron22 的原始拉取请求删除了对 dump() 的主线程调用: https://github.com/patx/pickledb/issues/18

但是当补丁被维护者 patx 合并时,它保留了主线程转储:https://github.com/patx/pickledb/commit/658fdda86abbd1b5a37fb0f9fc678ca145cc25c6

无论如何,这一切都没有意义,即使在单独的线程中写入文件也无法使您免于所有数据损坏的情况。在数据库中写入结构化数据时,您需要实际执行原子文件系统操作或具有日志功能以防止数据损坏,这两者都不是容易实现的。

这也是为什么你不应该将别人的宠物数据库项目用于重要项目的另一个原因,尤其是那些几乎没有维护的项目。保持主流数据库。