数据库
首页 > 数据库> > python-多进程sqlite插入:“数据库已锁定”

python-多进程sqlite插入:“数据库已锁定”

作者:互联网

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

我正在实现一个多进程脚本,每个进程都需要在sqlite表中写入一些结果.我的程序不断崩溃,数据库被锁定(使用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()

我尝试通过在主线程中声明一个锁并将其用作scan()中的全局变量来使用锁,但这并没有阻止我将数据库锁定.

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

编辑:

我在基于Debian的Linux上运行.

解决方法:

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

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

…等待30秒.

标签:sqlite,multiprocess,python
来源: https://codeday.me/bug/20191029/1956471.html