python - 多进程 sqlite INSERT : "database is locked"

标签 python sqlite multiprocess

(请注意:有一个问题叫做“SQLite3 and Multiprocessing”,但这个问题实际上是关于多线程的,所以是公认的答案,这是'重复)

我正在实现一个多进程脚本,每个进程都需要在 sqlite 表中写入一些结果。我的程序不断崩溃,database is locked(使用 sqlite 一次只允许修改一个数据库)。

这是我所拥有的示例:

def scan(n):
    n = n + 1 # Some calculation

    cur.execute("                      \
                    INSERT INTO hello  \
                    (n)                \
                    VALUES ('"+n+"')   \
                ")

    con.commit()
    con.close()

    return True


if __name__ == '__main__':

    pool = Pool(processes=int(sys.argv[1]))

    for status in pool.imap_unordered(scan, range(0,9999)):
        if status:
            print "ok"

    pool.close()

我尝试通过在 main 中声明锁并在 scan() 中将其用作全局锁来使用锁,但这并没有阻止我获取 数据库已锁定

确保在多进程 Python 脚本中同时只发出一个 INSERT 语句的正确方法是什么?

编辑:

我在基于 Debian 的 Linux 上运行。

最佳答案

如果无法在(默认情况下)5 秒超时内获取写锁,则会发生这种情况。通常,确保您的代码以足够的频率提交其事务,从而释放锁并让其他进程有机会获取它。如果您想等待更长的时间,可以这样做:

db = sqlite.connect(filename, timeout=30.0)

...等待 30 秒。

关于python - 多进程 sqlite INSERT : "database is locked",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835664/

相关文章:

python - matplotlib Legend 中的 Latex 引用

database - SQLite和Firebase数据库之间的同步,用户离线数据存储在sqlite中,在线数据存储在firebase中

android - 如何将我的 RSS 提要保存在数据库中?

python多处理卡住

python - 如何在 django 中创建单个帖子和 url 详细信息的 View ?

python - 将解码后的 jpeg 绘制到开罗表面

python - PyQt QWebPage linkClicked 信号可以检测使用了哪个鼠标按钮

python-2.7 - sqlite3 python 2.7 如何从 sqlite3 启用更详细的错误报告(异常)?

python 在多个 CPU 核心上传播 subprocess.call

python - 在多进程中运行绘图时出现 matplotlib 错误