多进程sqlite插入:“数据库被锁定”

Jui*_*icy 7 python sqlite multiprocess

(请注意:有一个名为“ SQLite3 和 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()
Run Code Online (Sandbox Code Playgroud)

我已经尝试通过在 main 中声明一个锁并将其用作全局 in 来使用锁scan(),但这并没有阻止我获得database is locked.

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

编辑:

我在基于 Debian 的 Linux 上运行。

Cha*_*ffy 7

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

db = sqlite.connect(filename, timeout=30.0)
Run Code Online (Sandbox Code Playgroud)

...等待 30 秒。

  • 理想情况下,为了提高性能,您希望在批量大小方面找到一个合理的中间立场。太短,你需要更多的整体时间,太大,你的个人事务需要太长时间(并长时间保持锁定)。当然,有时正确性问题会比性能更强烈地决定批量大小。 (4认同)