Python sqlite3 - 从多个线程只读=慢

时间:2016-04-04 19:40:11

标签: python multithreading sqlite

我有一个简单的Python类,它是Thread的子类。在run方法中,我连接到sqlite db,进行简单的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允许对并发线程进行读访问???

2 个答案:

答案 0 :(得分:1)

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

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

其次,您正在从六个线程执行“SAME”查询,这意味着您正在完成六倍的工作。如果您的单线程版本在循环中执行六个查询,那么比较公平的比较。

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

答案 1 :(得分:0)

我认为这是一个GIL问题。我没有子类Thread,而是切换到multiprocessing.Process - 该类的所有实例现在都执行类似的操作。