我有一个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循环会发生什么?忙着写作?
是否需要转到另一个数据库引擎?
答案 0 :(得分:0)
由于您总是使用线程,因此可以使用其他线程写入数据库。为了向数据提供数据,您应该使用全局可访问的Queue.Queue()
(Python3中的queue.Queue()
)实例。使用带有get()
的实例block=true
方法将使线程等待数据写入。