并发sqlite在python中写入

时间:2015-01-18 14:22:05

标签: python sqlite gtk

我有一个python应用程序(Gtk),它使用线程从某些站点获取信息并将它们写入数据库。

我有一个线程可以检查 site1 的新更新,如果有更新,我会收到一个json对象( json1 )。 然后我将遍历 json1 并将新信息插入到日期库中,在 json1 中,我需要使用该结果来获取 site2 。我也会在 site2 上回复一个json对象( json2 )。

所以情况是这样的

def get_more_info(name):
    json2 = get(www.site2.com?=name....)
    etc

for information in json1:
    db.insert(information)
    get_more_info(information.name)

从这种情况看,我发现有几种方法可以做到这一点。

get_more_info返回json对象以便

for information in json1:
    db.insert(information)
    json2 = get_more_info(information.name)
    for info in json2:
        db.insert(info)
db.commit()

get_more_info进行插入

for information in json1:
    db.insert(information)
    get_more_info(information.name)
db.commit()

这两种方式看起来都有点慢,因为主要for循环必须等待get_more_info完成才能继续进行,并且 json1 json2 可能很大,此时还有可能 site2 不可用,导致整个事务失败。如果没有 json2 ,应用程序仍然可以运行,如果需要,可以在以后获取数据。

所以我考虑将information.name传递给队列,以便主循环可以继续并启动将监视该队列并执行get_more_info的线程。这是正确的方法吗?

我知道sqlite不会执行并发写入,如果我在主for循环忙的情况下get_more_info尝试写入时正确回想起来,sqlite将输出OperationalError: database is locked

现在get_more_info发生了什么,它是否被置于某种类型的写入队列中,或者等待主循环完成以及当get_more_info是什么时,主for循环会发生什么?忙着写作?

是否需要转到另一个数据库引擎?

1 个答案:

答案 0 :(得分:0)

由于您总是使用线程,因此可以使用其他线程写入数据库。为了向数据提供数据,您应该使用全局可访问的Queue.Queue()(Python3中的queue.Queue())实例。使用带有get()的实例block=true方法将使线程等待数据写入。