Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLite3与多处理_Python_Sqlite_Multiprocessing - Fatal编程技术网

Python SQLite3与多处理

Python SQLite3与多处理,python,sqlite,multiprocessing,Python,Sqlite,Multiprocessing,我注意到,当我在多处理环境中使用sqlite3时,它并没有真正的能力和可靠性。每个进程都试图将一些数据写入同一个数据库,以便多个线程使用一个连接。我用check\u same\u thread=False选项尝试了它,但是插入的数量是非常随机的:有时它包含所有内容,有时不包含所有内容。我应该只并行处理函数的一部分(从web获取数据),将它们的输出堆叠到一个列表中,并将它们全部放在表中,还是有可靠的方法来处理sqlite的多连接?首先,多处理(多进程)和多线程之间有区别(一个进程中有多个线程) 似

我注意到,当我在多处理环境中使用sqlite3时,它并没有真正的能力和可靠性。每个进程都试图将一些数据写入同一个数据库,以便多个线程使用一个连接。我用check\u same\u thread=False选项尝试了它,但是插入的数量是非常随机的:有时它包含所有内容,有时不包含所有内容。我应该只并行处理函数的一部分(从web获取数据),将它们的输出堆叠到一个列表中,并将它们全部放在表中,还是有可靠的方法来处理sqlite的多连接?

首先,多处理(多进程)和多线程之间有区别(一个进程中有多个线程)

似乎您在这里谈论的是多线程。在多线程环境中使用SQLite时,您应该注意以下几个注意事项:

  • 在多个数据库中,不要同时使用同一数据库连接 一根线
  • 在某些操作系统上,数据库连接应该 始终在最初创建它的同一线程中使用

请参见此处以获取更详细的信息:

如果我必须使用SQLITE构建您描述的系统,那么我将从编写异步服务器开始(使用
asynchat
模块)处理所有SQLITE数据库访问,然后我将编写其他进程来使用该服务器。当只有一个进程直接访问db文件时,它可以强制执行严格的查询顺序,这样就不会有两个进程相互碰撞的危险。它也比不断打开和关闭数据库更快db

事实上,我也会尽量避免维护会话,换句话说,我会尝试编写所有其他进程,以便每个数据库事务都是独立的。这至少意味着允许事务包含SQL语句列表,而不仅仅是一个,甚至可能需要一些
if then
功能,以便你需要选择一条记录,检查一个字段是否等于X,然后才更新该字段。如果你现有的应用程序在每次交易后都关闭数据库,那么你就不需要担心会话

你也许可以使用像nosqlite这样的东西

:围绕Python的sqlite3数据库的轻量级包装器,具有类似dict的接口和多线程访问支持


实际上,我一直在做一些非常类似的事情:

  • 多个进程(对于我来说,是一个由4到32名工作人员组成的处理池)
  • 每个流程工人都会做一些事情,包括获取信息 从web(为我调用Alchemy API)
  • 每个进程打开自己的sqlite3连接,所有连接都指向一个文件,每个连接 进程在从堆栈中获取下一个任务之前添加一个条目
起初,我认为我看到的问题与您相同,然后我追踪到从web检索信息时出现的重叠和冲突问题。因为我就在那里,我对sqlite和多处理进行了一些折磨性测试,发现我可以运行许多进程工作人员,所有人都连接并添加到同一个sqlite文件,而无需协调当我刚刚输入测试数据时,它是坚如磐石的

因此,现在我看一下您的短语“(从web获取数据)”-也许您可以尝试用一些虚拟数据替换该数据获取,以确保它确实是导致您出现问题的sqlite3连接。至少在我测试的情况下(现在正在另一个窗口中运行)我发现多个进程都可以通过它们自己的连接进行添加,而不会出现问题,但是您的描述与我遇到的问题完全匹配,即当两个进程在使用web API时相互重叠(实际上是非常奇怪的错误)有时无法获得预期的数据,这当然会在数据库中留下一个空槽。我最终的解决方案是在每个工作者中检测此故障,并在故障发生时重试web API调用(可能更优雅,但这是针对个人黑客的)


如果这不适用于您的情况,我很抱歉,如果没有代码,很难知道您面临的是什么,但是描述让我想知道您是否可以扩大您的考虑范围。

此外,sqlite在多进程环境中运行良好,只要您意识到锁定可能会导致某些调用超时(失败)我知道线程/进程之间的区别,我使用多个进程(带池的多进程模块)。我认为问题在于db锁,但进程内部没有生成错误消息(通常,我的进程不关心错误,它们似乎只是传递错误)…您还必须意识到,如果您要在多个系统上分散进程,您将享受到在网络系统上锁定文件的所有乐趣。这是一个困难的领域;实际上,最好将进程的数量保持在足够小的范围内,以便在单个系统上使用。@andrewcooke您在multi-pro中有sqlite的示例吗cess环境?你的意思是有一种方法可以将游标对象发送到子进程?还是子进程应该创建自己的游标?我没有得到第二部分…在我当前的设置中,每个进程连接数据库,执行插入,提交并关闭连接..你的意思是吗?这里的多线程支持意味着doe请不要中断您的代码,因为SQLite不会引发ProgrammingError异常。但是,从lib doc->“多线程支持不会给您带来任何性能好处。”()最好知道您在这个数据库上有什么pragma设置。。。