Python SQLite3与多处理
我注意到,当我在多处理环境中使用sqlite3时,它并没有真正的能力和可靠性。每个进程都试图将一些数据写入同一个数据库,以便多个线程使用一个连接。我用check\u same\u thread=False选项尝试了它,但是插入的数量是非常随机的:有时它包含所有内容,有时不包含所有内容。我应该只并行处理函数的一部分(从web获取数据),将它们的输出堆叠到一个列表中,并将它们全部放在表中,还是有可靠的方法来处理sqlite的多连接?首先,多处理(多进程)和多线程之间有区别(一个进程中有多个线程) 似乎您在这里谈论的是多线程。在多线程环境中使用SQLite时,您应该注意以下几个注意事项:Python SQLite3与多处理,python,sqlite,multiprocessing,Python,Sqlite,Multiprocessing,我注意到,当我在多处理环境中使用sqlite3时,它并没有真正的能力和可靠性。每个进程都试图将一些数据写入同一个数据库,以便多个线程使用一个连接。我用check\u same\u thread=False选项尝试了它,但是插入的数量是非常随机的:有时它包含所有内容,有时不包含所有内容。我应该只并行处理函数的一部分(从web获取数据),将它们的输出堆叠到一个列表中,并将它们全部放在表中,还是有可靠的方法来处理sqlite的多连接?首先,多处理(多进程)和多线程之间有区别(一个进程中有多个线程) 似
- 在多个数据库中,不要同时使用同一数据库连接 一根线
- 在某些操作系统上,数据库连接应该 始终在最初创建它的同一线程中使用
请参见此处以获取更详细的信息:如果我必须使用SQLITE构建您描述的系统,那么我将从编写异步服务器开始(使用
asynchat
模块)处理所有SQLITE数据库访问,然后我将编写其他进程来使用该服务器。当只有一个进程直接访问db文件时,它可以强制执行严格的查询顺序,这样就不会有两个进程相互碰撞的危险。它也比不断打开和关闭数据库更快db
事实上,我也会尽量避免维护会话,换句话说,我会尝试编写所有其他进程,以便每个数据库事务都是独立的。这至少意味着允许事务包含SQL语句列表,而不仅仅是一个,甚至可能需要一些if then
功能,以便你需要选择一条记录,检查一个字段是否等于X,然后才更新该字段。如果你现有的应用程序在每次交易后都关闭数据库,那么你就不需要担心会话
你也许可以使用像nosqlite这样的东西
:围绕Python的sqlite3数据库的轻量级包装器,具有类似dict的接口和多线程访问支持
实际上,我一直在做一些非常类似的事情:
- 多个进程(对于我来说,是一个由4到32名工作人员组成的处理池)
- 每个流程工人都会做一些事情,包括获取信息 从web(为我调用Alchemy API)
- 每个进程打开自己的sqlite3连接,所有连接都指向一个文件,每个连接 进程在从堆栈中获取下一个任务之前添加一个条目
如果这不适用于您的情况,我很抱歉,如果没有代码,很难知道您面临的是什么,但是描述让我想知道您是否可以扩大您的考虑范围。此外,sqlite在多进程环境中运行良好,只要您意识到锁定可能会导致某些调用超时(失败)我知道线程/进程之间的区别,我使用多个进程(带池的多进程模块)。我认为问题在于db锁,但进程内部没有生成错误消息(通常,我的进程不关心错误,它们似乎只是传递错误)…您还必须意识到,如果您要在多个系统上分散进程,您将享受到在网络系统上锁定文件的所有乐趣。这是一个困难的领域;实际上,最好将进程的数量保持在足够小的范围内,以便在单个系统上使用。@andrewcooke您在multi-pro中有sqlite的示例吗cess环境?你的意思是有一种方法可以将游标对象发送到子进程?还是子进程应该创建自己的游标?我没有得到第二部分…在我当前的设置中,每个进程连接数据库,执行插入,提交并关闭连接..你的意思是吗?这里的多线程支持意味着doe请不要中断您的代码,因为SQLite不会引发ProgrammingError异常。但是,从lib doc->“多线程支持不会给您带来任何性能好处。”()最好知道您在这个数据库上有什么pragma设置。。。