Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python编写并发sqlite_Python_Sqlite_Gtk - Fatal编程技术网

用python编写并发sqlite

用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

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

我有一个线程检查site1上的新更新,如果有更新,我会收到一个json对象(json1)。 然后我将遍历json1并将新信息插入数据库,在json1中,我需要使用一个结果在站点2获取更多信息。我还将在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)
从这种情况下,我看到有两种方法可以做到这一点

获取更多信息
返回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
完成才能继续,而且json1json2都可能很大,还有一种可能是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