(请注意:有一个问题叫做“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/