我注意到,当我在一个多进程环境中使用sqlite3时,它并不具备真正的能力和可靠性。每个进程都试图将一些数据写进同一个数据库,因此一个连接被多个线程使用。我试着用check_same_thread=False选项,但插入的数量是非常随机的。有时它包括所有内容,有时不包括。我是否应该只对函数的一部分进行并行处理(从网上获取数据),把它们的输出堆成一个列表,然后把它们全部放入表中,或者有什么可靠的方法可以用sqlite处理多连接?
首先,多处理(多进程)和多线程(多线程)之间是有区别的。 one process).
看来你在这里说的是多线程。在多线程环境中使用SQLite时,有几个注意事项是你应该注意的。这一点 SQLite文档 mentions the following:
更详细的信息见这里。 SQLite是线程安全的吗?
实际上,我刚刚在做一些非常类似的工作。
起初我以为我看到的是和你一样的问题,然后我把它追溯到从网上检索信息的重叠和冲突问题。由于我就在那里,我对sqlite和多进程做了一些折磨人的测试,发现我可以运行许多进程工人,都连接并添加到同一个sqlite文件,而不需要协调,当我只是把测试数据放进去的时候,它是坚硬的。
所以我现在看到你的短语"(从网上获取数据)"--也许你可以尝试用一些假数据来代替数据的获取,以确保真的是sqlite3连接导致你的问题。至少在我的测试案例中(现在正在另一个窗口中运行),我发现多个进程都能通过自己的连接进行添加而没有问题,但你的描述与我遇到的问题完全吻合,当两个进程在获取网络API时互相踩踏(实际上是非常奇怪的错误),有时没有得到预期的数据,这当然会在数据库中留下一个空槽。我最终的解决方案是在每个工作者内部检测这种故障,并在它发生时重试Web API调用(本来可以更优雅,但这是为了个人黑客)。
如果这不适用于你的情况,我很抱歉,没有代码,很难知道你所面临的情况,但描述让我怀疑你是否可以扩大你的考虑范围。
sqlitedict :一个围绕Python的sqlite3数据库的轻量级包装器,具有类似于dict的界面和多线程访问支持。