用python编写并发sqlite
我有一个python应用程序(Gtk),它使用线程从某些站点获取信息并将其写入数据库 我有一个线程检查site1上的新更新,如果有更新,我会收到一个json对象(json1)。 然后我将遍历json1并将新信息插入数据库,在json1中,我需要使用一个结果在站点2获取更多信息。我还将在site2接收一个json对象(json2) 所以情况是这样的用python编写并发sqlite,python,sqlite,gtk,Python,Sqlite,Gtk,我有一个python应用程序(Gtk),它使用线程从某些站点获取信息并将其写入数据库 我有一个线程检查site1上的新更新,如果有更新,我会收到一个json对象(json1)。 然后我将遍历json1并将新信息插入数据库,在json1中,我需要使用一个结果在站点2获取更多信息。我还将在site2接收一个json对象(json2) 所以情况是这样的 def get_more_info(name): json2 = get(www.site2.com?=name....) etc
def get_more_info(name):
json2 = get(www.site2.com?=name....)
etc
for information in json1:
db.insert(information)
get_more_info(information.name)
从这种情况下,我看到有两种方法可以做到这一点
获取更多信息
返回json对象,以便
for information in json1:
db.insert(information)
json2 = get_more_info(information.name)
for info in json2:
db.insert(info)
db.commit()
获取更多信息
执行插入操作
for information in json1:
db.insert(information)
get_more_info(information.name)
db.commit()
这两种方法似乎都有点慢,因为主for循环必须等待get\u more\u info
完成才能继续,而且json1和json2都可能很大,还有一种可能是site2此时不可用,导致整个事务失败。应用程序仍然可以在没有json2的情况下运行,如果需要,可以在以后提取数据
因此,我考虑将information.name
传递给队列,以便主循环可以继续并启动一个线程,该线程将监视该队列并执行获取更多信息。这是正确的方法吗
我知道sqlite不会执行并发写入,如果我正确地回忆起如果get\u more\u info
在主for循环忙时尝试写入,sqlite将输出OperationalError:数据库被锁定
现在,get\u more\u info
在这一点上发生了什么,它是被放入某种类型的写队列还是等待主循环完成,以及当get\u more\u info
正在忙着写时,主for循环会发生什么
是否需要转到其他数据库引擎?由于您总是使用线程,因此可以使用其他线程写入数据库。为了向它提供数据,您应该使用一个全局可访问的Queue.Queue()
(Queue.Queue()
在Python3中)实例。使用实例get()
方法和block=true
将使线程等待数据写入。我不确定使用执行写入的线程是否与某些插入一样有效,插入后需要发出通知。我想的是启动一个新线程并将信息.name
传递到一个队列,然后新创建的线程可以q.get