多进程sqlite INSERT:"数据库被锁定"

时间:2014-11-10 02:02:53

标签: python sqlite multiprocess

(请注意:有一个名为“ SQLite3和多处理”的问题,但该问题实际上是关于多线程,所以接受的答案也是如此,这不是不重复)

我正在实现一个多进程脚本,每个进程都需要在sqlite表中写一些结果。我的程序与database is locked一起崩溃(对于sqlite,一次只允许一次DB修改)。

以下是我所拥有的一个例子:

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()

我尝试使用锁定,在主要部分中声明锁定并将其用作scan()中的全局锁定,但它并没有阻止我获取database is locked

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

编辑:

我在基于Debian的Linux上运行。

1 个答案:

答案 0 :(得分:4)

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

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

......等待30秒。