Python sqlite3-只读多线程=SLOW



我有一个简单的Python类,它是Thread的子类。在run方法中,我连接到sqlitedb,进行一个简单的select查询,然后关闭连接。相当标准的东西:

def run(self):
    conn = sqlite3.connect(SHAPE_CACHE_DB)
    curs = conn.cursor()
    curs.execute('SELECT * from foo')
    for row in curs.fetchall():
       # do stuff
    curs.close()
    conn.close()

当一次只运行一个线程时,run方法执行得非常快——让我们只<1秒。但是,如果类的多个实例被实例化并运行——比方说6个或更多,那么run方法可能需要很多秒???

我猜线程之间的读取访问之间存在一些争用。但我认为sqlite允许对并发线程进行读取访问???

首先,sqlite模块不是线程安全的:

https://docs.python.org/2/library/sqlite3.html#multithreading

其次,您正在从六个线程中执行"SAME"查询,这意味着您所做的工作是原来的六倍。如果您的单线程版本在一个循环中执行六个查询,则比较公平一些。

第三,因为您将使用多个线程进行线程切换,并为此付出一些代价。

我认为这是一个GIL问题。我切换到多处理,而不是子类线程。进程-类的所有实例现在都执行类似的操作。

最新更新