dor*_*vak 4 python sqlite multiprocessing
我注意到当我在多处理环境中使用它时,sqlite3不是真的有能力也不可靠.每个进程都会尝试将一些数据写入同一个数据库,以便多个线程使用连接.我尝试使用check_same_thread = False选项,但插入次数非常随机:有时它包含所有内容,有时不包括.我应该并行过程只有功能(从网络读取数据)的部分,堆栈它们的输出到一个列表,并把它们放到桌子一起还是有处理与sqlite的多连接的可靠的方法?
我实际上只是在做一些非常相似的事情:
起初我以为我看到了与您相同的问题,然后我将其追溯到与从网络检索信息的重叠和冲突问题。由于我就在那里,我对 sqlite 和 multiprocessing 进行了一些折磨测试,发现我可以运行许多进程工作人员,所有进程都无需协调即可连接并添加到同一个 sqlite 文件,当我刚刚放入测试数据时,它坚如磐石。
所以现在我正在查看您的短语“(从网络获取数据)” - 也许您可以尝试用一些虚拟数据替换该数据获取,以确保它确实是导致您出现问题的 sqlite3 连接。至少在我的测试案例中(现在在另一个窗口中运行),我发现多个进程都能够通过自己的连接添加而没有问题,但是您的描述与我在两个进程相互踩踏时遇到的问题完全匹配对于 web API(实际上是非常奇怪的错误),有时没有得到预期的数据,这当然会在数据库中留下一个空位。我的最终解决方案是在每个工作人员中检测此故障,并在它发生时重试 Web API 调用(本来可以更优雅,但这是针对个人黑客的)。
如果这不适用于您的情况,我很抱歉,没有代码就很难知道您面对的是什么,但是描述让我想知道您是否可以扩大您的考虑范围。
首先,多处理(多进程)和多线程(一个进程中的多个线程)之间存在差异.
看来你在这里谈的是多线程.在多线程环境中使用SQLite时,您应该注意几点需要注意的事项.在SQLite的文档提到了以下几点:
- 不要在多个线程中同时使用相同的数据库连接.
- 在某些操作系统上,应始终在最初创建数据库连接的同一线程中使用数据库连接.
有关更多详细信息,请参见此处:SQLite是否可以线程安全?
sqlitedict:Python sqlite3 数据库的轻量级包装器,具有类似字典的界面和多线程访问支持。
| 归档时间: |
|
| 查看次数: |
13076 次 |
| 最近记录: |