[英]concurrent sqlite writes in python
我有一个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()
这两种方法似乎有点慢,因为main for循环将不得不等待get_more_info
完成才进行操作,并且json1和json2都可能很大, 这时有可能site2不可用 ,从而导致整个事务失败。 该应用程序仍可以在没有json2的情况下运行 ,如果需要,可以在以后的时间获取数据。
所以我在考虑将information.name
传递到队列,以便主循环可以继续并启动一个线程,该线程将监视该队列并执行get_more_info
。 这是正确的方法吗?
我知道sqlite不会执行并发写入,如果在main for循环忙时get_more_info
尝试写入时,如果我正确地调用,sqlite将输出OperationalError: database is locked
。
现在,此时get_more_info
会发生什么情况,它是否被放入某种类型的写队列中,还是等待主循环完成?当get_more_info
编写时,主for循环会发生什么?
是否需要使用另一个数据库引擎?
由于您始终使用线程,因此可以使用其他线程写入数据库。 为了向其中提供数据,您应该使用全局可访问的Queue.Queue()
(在Python3中为queue.Queue()
)实例。 将实例get()
方法与block=true
将使线程等待数据写入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.