Python Sqlite并发访问

时间:2018-05-07 18:11:30

标签: python database python-3.x concurrency sqlite

我有一个场景,第三方应用程序扫描文件夹并触发我的python脚本/生成的EXE次数(是的!单独进程的数量)文件夹中的文件数。 我的脚本/应用程序将文件的路径写入本地sqlite数据库,调用下一个应用程序并退出。 我的脚本/应用程序需要注意它只调用下一个应用程序的一个实例。但是,调用我的脚本的第三方应用程序无法做任何事情。

问题 有时可以同时调用我的脚本/应用程序的1000多个实例,导致与本地sqlite数据库的近1000个并发连接。 由于sqlite可能的并发连接数量有限,因此某些进程正在锁定数据库并且#34;例外。这导致某些文件名未写入数据库 我们想出了一个解决这个问题的方法。我们在无限循环中写入数据库。在遇到异常时,我们让线程休眠50毫秒并再次尝试直到写入工作。我知道这不是一个干净的方法。

有更好的方法吗?我如何处理1000可能是10000或可能是更多的并发连接,但每个脚本成功?

2 个答案:

答案 0 :(得分:0)

通常你会使用池管理器来处理这种类型的负载。不幸的是,你正在使用错误的技术,因此遇到了一个不适合的问题。您应该将代码切换到postgres SQL服务器,并使用pgbouncer对连接进行负载平衡。幸运的是,您的SQL代码都不需要更改,只需要连接方法,但您会看到性能优势。

https://pgbouncer.github.io/

处理此问题的唯一方法是自己创建一个池,并让连接连接到它而不是直接连接到SQLITE数据库。

答案 1 :(得分:0)

您的解决方法是正确的,但您可以通过设置busy timeout使数据库完成大部分工作。 (对于1000个连接,这需要设置得非常高,基本上是无限的,就像你已经在做的那样。)

但这仍会导致随机等待时间。 SQLite不会等到一个编写器的事务完成后再向下一个事件发出信号,因为没有 portable API。但是,在Windows中,您可以使用名为mutex object(需要一些trickery来从Python访问它)。