相关文章推荐
坏坏的猴子  ·  sqlite ...·  2 月前    · 
刚失恋的蚂蚁  ·  sql - Fastest Way ...·  2 月前    · 
阳光的香槟  ·  How to use On Error ...·  6 月前    · 
多情的剪刀  ·  MongoDB_Jowin's ...·  2 年前    · 
心软的热带鱼  ·  android中HorizontalScro ...·  2 年前    · 

SQLite3和多处理

8 人关注

我注意到,当我在一个多进程环境中使用sqlite3时,它并不具备真正的能力和可靠性。每个进程都试图将一些数据写进同一个数据库,因此一个连接被多个线程使用。我试着用check_same_thread=False选项,但插入的数量是非常随机的。有时它包括所有内容,有时不包括。我是否应该只对函数的一部分进行并行处理(从网上获取数据),把它们的输出堆成一个列表,然后把它们全部放入表中,或者有什么可靠的方法可以用sqlite处理多连接?

1 个评论
如果能知道你在这个数据库上有哪些pragma设置就好了......
python
sqlite
multiprocessing
dorvak
dorvak
发布于 2011-08-07
4 个回答
omz
omz
发布于 2011-08-07
已采纳
0 人赞同

首先,多处理(多进程)和多线程(多线程)之间是有区别的。 one process).

看来你在这里说的是多线程。在多线程环境中使用SQLite时,有几个注意事项是你应该注意的。这一点 SQLite文档 mentions the following:

  • Do not use the same database connection at the same time in more than one thread.
  • On some operating systems, a database connection should always be used in the same thread in which it was originally created.
  • 更详细的信息见这里。 SQLite是线程安全的吗?

    补充一点,sqlite在多进程环境中工作得很好,只要你知道锁定可能导致一些调用超时(失败),然后需要重新尝试。
    我知道线程/进程的区别,而且我使用了多个进程(带池的多进程模块)。我认为问题出在数据库锁上,但在进程中没有产生错误信息(一般来说,我的进程不关心错误,它们似乎只是传递它们)......
    你还必须意识到,如果你在多个系统中耕耘进程,你将会有网络系统上的文件锁定的所有乐趣。这是一个很难的领域。 真的 最好是保持足够小的进程数量,以便在单个系统上使用。
    @andrewcooke 你有一个多进程环境下的sqlite例子吗?你的意思是有办法将游标对象发送到子进程中吗?还是说子进程应该创建自己的游标?
    Ezekiel Kruglick
    Ezekiel Kruglick
    发布于 2011-08-07
    0 人赞同

    实际上,我刚刚在做一些非常类似的工作。

  • multiple processes (for me a processing pool of 4 to 32 workers)
  • each process worker does some stuff that includes getting information from the web (a call to the Alchemy API for mine)
  • each process opens its own sqlite3 connection, all to a single file, and each process adds one entry before getting the next task off the stack
  • 起初我以为我看到的是和你一样的问题,然后我把它追溯到从网上检索信息的重叠和冲突问题。由于我就在那里,我对sqlite和多进程做了一些折磨人的测试,发现我可以运行许多进程工人,都连接并添加到同一个sqlite文件,而不需要协调,当我只是把测试数据放进去的时候,它是坚硬的。

    所以我现在看到你的短语"(从网上获取数据)"--也许你可以尝试用一些假数据来代替数据的获取,以确保真的是sqlite3连接导致你的问题。至少在我的测试案例中(现在正在另一个窗口中运行),我发现多个进程都能通过自己的连接进行添加而没有问题,但你的描述与我遇到的问题完全吻合,当两个进程在获取网络API时互相踩踏(实际上是非常奇怪的错误),有时没有得到预期的数据,这当然会在数据库中留下一个空槽。我最终的解决方案是在每个工作者内部检测这种故障,并在它发生时重试Web API调用(本来可以更优雅,但这是为了个人黑客)。

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

    Radim
    Radim
    发布于 2011-08-07
    0 人赞同

    sqlitedict :一个围绕Python的sqlite3数据库的轻量级包装器,具有类似于dict的界面和多线程访问支持。

    multi-thread support here means doesn't break your code as SQLite doesn't throw ProgrammingError Exception. However, from the lib doc -> "multithreaded support doesn’t give you any performance benefits." ( pypi.python.org/pypi/sqlitedict )
    Michael Dillon
    Michael Dillon
    发布于 2011-08-07
    0 人赞同